0

尝试读取从 NSTask 返回的数据会导致永远不会返回的挂起。我已经验证我正在运行的脚本实际上确实将数据返回到标准输出和标准错误。这是一个简单的两行 shell 脚本,将一行发送到 stdout,另一行发送到 stderr。

NSLog 输出说

得到句柄:<NSConcreteFileHandle: 0x10010a800>

然后它就挂了。这是我正在使用的代码。

    NSPipe *stderr = [NSPipe pipe];
    NSPipe *stdout = [NSPipe pipe];

    NSTask *task = [[NSTask alloc] init];
    task.standardError = stderr;
    task.standardOutput = stdout;
    task.standardInput = [NSPipe pipe];
    task.launchPath = @"/tmp/f";

    [task launchPath];
    [task waitUntilExit];

    NSFileHandle *fh = [stderr fileHandleForReading];

    NSLog(@"Got handle: %@", fh);

    [fh readDataToEndOfFile];

    NSLog(@"Read it");
4

2 回答 2

1

这是因为您从未真正启动过您的任务。你打电话

[task launchPath];

这只是将任务的路径作为字符串返回,它实际上并没有启动任务。你要

[task launch];
于 2013-07-02T17:28:05.060 回答
0

汤姆是对的,但您还需要在尝试调用之前启动任务readDataToEndOfFile

于 2020-12-18T08:18:10.530 回答