2017-01-09 29 views
1

Linuxの終了ステータスとSIGCHLDの違いは何ですか?wait()SIGCHLDと終了ステータス

子供が終了すると、によってブロックされたSIGCHLDシグナルが送信されます(なぜなら、子供の終了ステータスが必要なのでしょうか? SIGCHLDと終了ステータスのリンクが見つかりません。

+0

親プロセスが\ _exitを呼び出す子プロセスからの待機によってどのように終了ステータスを取得するのか(http://stackoverflow.com/q/6749475)。また、子プロセスを待つためにwait()を使用している場合は、[子プロセスの終了ステータスコードの取得](http://stackoverflow.com/q/27306764)と[SIGCHLDハンドラで何かする必要がありますか?終了時刻?](http://stackoverflow.com/q/18437779) – jww

答えて

4

子プロセスの終了ステータスは、exit()(または_exit())システムコールによって親プロセスに返される値です。これは通常、子プロセスの成功または失敗を示す単純な整数であり、ゼロは成功(慣例による)を示します。

SIGCHLDは、子プロセスが終了したときに親プロセスに送信される信号です。これは、待機中の親に、その子が終了したことを通知するだけです。

2つの組み合わせは、子プロセスの実行結果をその親に戻すために使用されます。シグナルは、子が終了したときに親に通知し、終了ステータスは、子の実行結果が親に通知します。親は、子が終了したことを示す信号(またはwait()またはwaitpid()からの戻り値)を受信するまで、子の終了ステータスを取得することはできません。

いくつかの方法(様々なIPCメカニズム、ファイルI/Oなど)が、最も簡単な方法でバック親にその実行結果を通信することができ、子供がの子の整数ステータスコードを送信する exit()wait()を使用している

親。

親プロセスが子の実行ステータスが何であるかを気にしない場合は、wait()から返された子の終了コードを無視できます。一方、複雑なシステムでは、子プロセスの新しいインスタンスを再起動(fork())したり、子プロセスが完了した(または完了しなかった)場合には他のプログラムを実行するために、終了ステータスが何であるかを知る必要がありますそのタスクは適切に行われます。

+0

verry先生、ありがとう、信号と終了ステータスの組み合わせが分かりました。 – arctic

3

終了状態は、プロセスによって(exitへの呼び出しによって)返され、親プロセスに成功したかどうかを通知します。

親プロセスがwaitまたはwaitpidを呼び出すと、その終了ステータス(およびwaitpidの場合、その子のPID)を受け取り、その値に基づいて決定を下すことができます。

親がSIGCHLDシグナルを受信した場合、プロセスにその子プロセスの1つが終了したことを伝えるすべてが通知されます。親に子のpidまたは終了ステータスに関する情報を与えるものではありません。親に、waitまたはwaitpidを呼び出す時間だと非同期的に伝える方法です。

+0

あなたに感謝しているので、信号は親に "待機"を介して子の終了ステータスを取得する "行く"を与えています。 – arctic

関連する問題