2015-10-29 6 views
7

NSTaskを同期して使用する必要がありますが、ときどき自分のタスクが 'waitUntilExit'コマンドの下でハングすることがあります。私は、優雅なやり方があるのだろうか - エラー処理方法 - ハンギングタスクを終了して別のものを再起動することができるのだろうか?waitUntilExitを使用してNSTaskを掛ける

答えて

1

-[task launch]を使用してタスクを起動し、その完了したかどうかを確認するためにそのisRunningプロパティを定期的にポーリングできます。所定の時間間隔の後に終了していない場合は、-[task terminate]に電話をかけて終了することができます。これは、起動するタスクがSIGTERMシグナルを無視しないことを要求します。

タスク終了のポーリングがあなたのケースではあまりにも効率的でない場合は、タスクを起動した後にタイプDISPATCH_SOURCE_TYPE_PROCのディスパッチソースを設定できます。タスクがNSTaskを介して出力パイプを埋め実行された場合、処理が効果的に戻ってからwaitUntilExitを遮断する、ハングアップすることを

dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, task.processIdentifier, DISPATCH_PROC_EXIT, dispatch_get_main_queue()); 
12

注:タスクが終了したときに、このソースは、非同期のイベントブロックを呼び出します。

あなたは、これは、出力パイプのデータは、パイプが閉じる出力への書き込みプロセスまで読まれることになります

[task waitUntilExit]; 

を呼び出す前に

[task.standardOutput.fileHandleForReading readDataToEndOfFile]; 

を呼び出すことによって、この状況を防ぐことができます。

問題や様々なソリューションを実証するサンプルコード:

https://github.com/lroathe/PipeTest

+1

すごいです!それを指摘してくれてありがとう - 私に吊り下げパイプを待っている時間の負荷を節約.. – Jay

関連する問題