gpt4 book ai didi

cocoa - NSTask 不会终止

转载 作者:行者123 更新时间:2023-12-03 16:53:06 28 4
gpt4 key购买 nike

我正在尝试使用 NSTask 运行 UNIX 'apropos' 命令。这是我的代码:

NSTask *apropos = [[NSTask alloc] init];
NSPipe *pipe = [[NSPipe alloc] init];
[apropos setLaunchPath:@"/usr/bin/apropos"];
[apropos setArguments:[NSArray arrayWithObjects:@"filename", @"match", nil]];
[apropos setStandardOutput:pipe];
[apropos launch];
[apropos waitUntilExit];

问题是这永远不会返回。我还尝试使用 Apple 的示例代码 (TaskWrapper),它返回输出(分三段),但它从未调用 processFinished 处理程序。

此外,appendOutput: 处理程序接收重复​​项。因此,例如,如果 apropos 返回:

12345

我可能会收到这样的东西:

123

1234

5

(分为 3 条附加消息)。

我注意到 Apropos 以一种可以在命令行中上下滚动的格式显示输出,而不是直接将数据直接输出到标准输出;如何通过 NSTask 和 NSPipe 可靠地读取此内容?

最佳答案

我刚刚测试了这个程序,它运行良好:程序终止,并且 /tmp/apropos.txt 包含 apropos 的输出。

#import <Foundation/Foundation.h>

int main()
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];

NSTask *apropos = [[[NSTask alloc] init] autorelease];
NSPipe *pipe = [[[NSPipe alloc] init] autorelease];
NSFileHandle *readHandle = [pipe fileHandleForReading];
[apropos setLaunchPath:@"/usr/bin/apropos"];
[apropos setArguments:[NSArray arrayWithObjects:@"filename", @"match", nil]];
[apropos setStandardOutput:pipe];
[apropos launch];
[apropos waitUntilExit];

NSString *output = [[[NSString alloc]
initWithData:[readHandle readDataToEndOfFile]
encoding:NSUTF8StringEncoding] autorelease];

[output writeToFile:@"/tmp/apropos.txt" atomically:YES
encoding:NSUTF8StringEncoding error:NULL];

[pool drain];
return 0;
}

您是否有机会使用NSLog()来检查输出?如果是这样,您可能需要为 stdin 设置管道,如下所述 in this answer of mine to an NSTask related question 。看来 NSLog()stderr 发送数据会影响 NSTask

关于cocoa - NSTask 不会终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4765559/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com