2015-10-29 90 views
7

我需要同步使用NSTask,但是我發現偶爾我的任務掛在'waitUntilExit'命令下。我想知道是否有一種優雅的方式 - 一種錯誤處理方法 - 終止掛起的任務,以便我可以重新啓動另一個?使用waitUntilExit掛載NSTask

回答

1

您可以使用-[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()); 
12

注意,如果通過NSTask正在運行的任務充滿輸出管道則該過程將掛起,有效地阻止返回waitUntilExit:當任務終止此源然後異步調用它的事件塊。

您可以調用

[task waitUntilExit]; 

這將導致讀取輸出管道的數據,直到該進程寫入輸出管道關閉之前,防止這種情況發生,通過調用

[task.standardOutput.fileHandleForReading readDataToEndOfFile]; 

示例代碼演示問題和各種解決方案:

https://github.com/lroathe/PipeTest

+1

真棒!感謝您指出了這一點 - 節省了我等待懸掛管道的時間。 – Jay