我需要同步使用NSTask,但是我發現偶爾我的任務掛在'waitUntilExit'命令下。我想知道是否有一種優雅的方式 - 一種錯誤處理方法 - 終止掛起的任務,以便我可以重新啓動另一個?使用waitUntilExit掛載NSTask
7
A
回答
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];
。
示例代碼演示問題和各種解決方案:
相關問題
- 1. NSTask waitUntilExit未按預期方式工作
- 2. NSTask信號量在多重卡住waitUntilExit
- 3. 如何安全地在主線程中使用[NSTask waitUntilExit]?
- 4. NSTask掛在readDataToEndOfFile
- 5. 終止掛起的NSTask
- 6. 使用與NSTask
- 7. 從NSTask使用launchctl
- 8. 使用NSTask:返回輸出
- 9. 如何使用NSTask和NSPredicate?
- 10. Ruby使用RVM掛載負載
- 11. 目標C:錯誤使用NSTask卸載USB驅動器
- 12. 用於SSH的NSTask使用PTY
- 13. 使用NSTask運行終端命令
- 14. NSTask在函數中使用時崩潰
- 15. 使用NSTask交互式訪問命令
- 16. 如何在pbcopy中使用NSTask?
- 17. 使用NSTask更改osx網絡配置
- 18. 使用NSTask時的處理錯誤
- 19. 掛載rootfs_linux.go權限時掛載/ proc
- 20. 如何使用Nutch索引NFS掛載?
- 21. array_multisort如何使用foreach掛載
- 22. 使用GRUB2環回命令掛載VHD
- 23. 使用快照的AWS EBS卷掛載
- 24. 使用寫入權限掛載vfat
- 25. 使用davfs掛載git http存儲庫
- 26. python - 使用boto3掛載EBS卷
- 27. 使用WMI掛載網絡驅動器
- 28. 使用davfs2掛載webdav共享
- 29. 使用ecryptfs掛載多個目錄
- 30. Cocoa:使用FSMountServerVolumeSync掛載SMB文件夾
真棒!感謝您指出了這一點 - 節省了我等待懸掛管道的時間。 – Jay