Ant*_*ony 9 error-handling cocoa nstask
我需要同步使用NSTask,但我发现偶尔我的任务会在'waitUntilExit'命令下挂起.我想知道是否有一种优雅的方式 - 错误处理方法 - 终止挂起的任务,以便我可以重新启动另一个?
小智 17
请注意,如果通过NSTask填充输出管道运行的任务,则进程将挂起,从而有效阻止waitUntilExit返回.
您可以通过致电来防止这种情况
[task.standardOutput.fileHandleForReading readDataToEndOfFile];
Run Code Online (Sandbox Code Playgroud)
在打电话之前
[task waitUntilExit];
Run Code Online (Sandbox Code Playgroud)
这将导致输出管道的数据被读取,直到写入输出管道的进程关闭它.
示例代码演示了问题和各种解决方案:
https://github.com/lroathe/PipeTest
小智 2
您可以使用启动任务-[task launch],然后定期轮询其isRunning属性以检查它是否已完成。如果在给定的时间间隔后仍未完成,您可以调用-[task terminate]来终止它。这要求您启动的任务不会忽略 SIGTERM 信号。
但是,如果在您的情况下轮询任务终止效率太低,您可以DISPATCH_SOURCE_TYPE_PROC在启动任务后设置一个类型的调度源。然后,当任务终止时,该源异步调用其事件块:
dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, task.processIdentifier, DISPATCH_PROC_EXIT, dispatch_get_main_queue());
Run Code Online (Sandbox Code Playgroud)