使用waitUntilExit挂起NSTask

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认同)

小智 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)