首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTask不会终止

NSTask不会终止
EN

Stack Overflow用户
提问于 2011-01-22 09:26:21
回答 2查看 1.6K关注 0票数 1

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

代码语言:javascript
复制
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];

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

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

1 2 3 4 5

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

1 2 3

1 2 3 4

5

(分组为3个附加消息)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-22 10:00:49

我刚刚测试了这个程序,它工作得很好:程序终止,/tmp/apropos.txt包含apropos的输出。

代码语言:javascript
复制
#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()检查输出?如果是这样,您可能需要按照in this answer of mine to an NSTask related question的说明为stdin设置一个管道。似乎NSLog()stderr发送数据会影响NSTask

票数 3
EN

Stack Overflow用户

发布于 2011-01-22 09:35:00

对于您的原始代码,我认为这是因为您没有读取命令的输出。管道只有有限的缓冲区大小,如果您不读取任务的输出,它可能会挂起,等待缓冲区清空。我对您尝试的示例代码一无所知,因此我对此无能为力。至于最后一个问题,apropos只在连接到终端时才使用寻呼机。您不是在模拟终端,所以您不必担心。您可以通过在终端中运行apropos whatever | cat并验证未调用寻呼机来证明这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4765559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档