我用来在我的沙盒应用程序上NSUserUnixTask
运行未沙NSTask
盒。但是,我的代码挂在对[NSFileHandle readDataToEndOfFile]
. 如果我删除这些调用,它会完美运行。如果我用它替换[NSFileHandle readDataToEndOfFile]
它[NSFileHandle availableData]
也会挂起。
这是代码:
NSUserUnixTask* unixTask = [[NSUserUnixTask alloc] initWithURL: [NSURL fileURLWithPath: path] error: nil];
// Create error file handle
NSFileHandle* errorFH = [NSFileHandle fileHandleWithStandardError];
[unixTask setStandardError: errorFH];
// Create output file handle
NSFileHandle* outputFH = [NSFileHandle fileHandleWithStandardOutput];
[unixTask setStandardOutput: outputFH];
// Run task with termination handler
[unixTask executeWithArguments: nil completionHandler: ^(NSError* error2) {
// Save output
NSString* output = [[NSString alloc] initWithData: [outputFH readDataToEndOfFile] encoding: NSUTF8StringEncoding];
if ([output length]) { // <-- Execution never reaches this line when the block is called
NSLog(@"%@", output);
}
// Read error 1
NSString* error1 = [[NSString alloc] initWithData: [errorFH readDataToEndOfFile] encoding: NSUTF8StringEncoding];
if ([error1 length]) {
NSLog(@"%@", error1);
}
// Read error 2
if (error2) {
NSLog(@"%@", error2);
}
}];
Xcode 的控制台上没有记录任何内容,但是如果我打开 Console.app,我会看到这一行:
Warning: Exception caught during decoding of received reply to message 'executeScript:interpreter:arguments:standardInput:standardOutput:standardError::', dropping incoming message and calling failure block.
Exception: *** -[NSConcreteFileHandle readDataOfLength:]: Bad file descriptor
嗯,我该如何解决这个问题?在我将我的应用程序沙盒化之前,我将NSPipe
其与 结合使用NSTask
并且一切正常,但现在NSUserUnixTask
需要使用NSFileHandle
代替,我认为我的问题仅仅是因为我没有正确使用它。但我仍然不知道我做错了什么。