2017-01-06 4 views
0

system()を使用して長い実行プロセス(長いサウンドファイルを含む)を開始するプログラムに取り組んでおり、後で終了する可能性がありますこのプロセス。システム( "prog")呼び出しを呼び出し、その後システム( "killall prog")呼び出しを呼び出すのは簡単なことです。 pthreadを使用して、スレッドを起動して初期システム( "prog")呼び出しを呼び出し、その後アプリケーションが早期に終了することを検出すると、メインスレッドはシステム( "killall prog")を呼び出します。 printステートメントを通して、メインスレッドが停止するロジックを適切に検出するが、それ以降のシステムコールは、元のシステムコールが終了するまでブロックされることがわかります(メインスレッドは今回までブロックされていないようで、他のアクティビティはスレッド最初のシステムコールの作成)。私のプログラムがprogを起動した後に別のシェルからkillallを試すと、killlallが動作します(あなたが望むように)。私は、macOSは、uiライブラリとやりとりするプログラムに対する要件が、メインスレッドのみからそのようなアクティビティを処理する必要があることを知っています。私が明らかに知らないシステム(3)に砲撃するプログラムのための他の要件はありますか?OSX、Pthreads、システムコールの予期しないブロッキング動作

Windowsでは、コードの唯一の違いは「prog」の選択肢であり、動作は期待通りに機能します。

答えて

0

system()は起動したプログラムが終了するまでブロックされることが予想されます。そうでなければ、system()が返り値の一部として子プロセスの終了ステータスを返す方法はありません。

子プロセスと並行してスレッドを実行し続けるには、異なるAPIを使用する必要があります(通常fork()と子プロセスのforkの分岐からexec()を呼び出します)。

+0

私はスレッド化について十分理解していないと思います。あるスレッドがシステムを呼び出すと、そのブロックがブロックされると予想されます。別のスレッドがシステムに呼び出しを行うと、なぜ2番目の呼び出しブロックが別のスレッドからブロックされるのでしょうか?あなたはこれがシステムの特性であると言っていますか?カーネルはスレッドの使用に関係なくプログラムの文脈の中でこれを行なわないようにしていますか?あるいは私は何か他のものを逃していますか – Joshua

+0

system()を呼び出すスレッドだけがsystem()呼び出し内でブロックする必要があります。 –

+0

私は最初のシステムコールのスレッドをスピンアップして別のシステムコールを終了させるというアプローチをとっていると言いました。 – Joshua