2012-03-23 15 views
3

UNIXでは、バックグラウンドで子プロセスが終了すると、SIGCHLDシグナルが親に送信され、終了したことが通知されます。SIGCHLDシグナル処理

プロセスがフォアグラウンドであっても同じことが起こりますか?もしそうなら、これは親がそれを無視することを意味する。

これは正しいですか?または、フォアグランドであれば、信号はまったく送信されません。

+1

はい、SIGCHLDもフォアグラウンドプロセスのために送信されます、と私は信じています。 straceで確認できます。 –

+0

試しましたか? –

答えて

9

バックグラウンドとフォアグラウンドはジョブ制御の概念であり、シェルの一部です。それらはプロセスに適用され、どのプロセスが別のプロセスを生成(exec-ed)したかには影響しません。

子プロセスは、fork() - exec()呼び出しの結果です。子プロセスは、fork()呼び出しを実行したプロセスの親PIDを取得します。これはSIGCHLDシグナルの文脈であり、親のpidはSIGCHLDシグナルを受信します。子プロセスが "フォアグラウンド"か "バックグラウンド"かは関係ありません。プロセスの終了時にppidだけが重要です。

+0

親が正確に 'SIGCHLD'信号を送るのはいつですか?私が書いているコードでは、実行が開始されるとすぐに間違っているように見えます。 – darksky

+0

exectuableはプロセスの一部として実行します - プロセスの中で開いているファイル記述子などを閉じる部分シャットダウン中です。 crt0.o(別の名前を持つ可能性があります)というファイルが(実装によっては)それぞれの実行可能イメージにリンクされています。 _start()、_cleanup()などのいくつかのエントリポイントがあります。これらは、main()が戻るか、プロセスが_exit()またはexit()を呼び出した後に呼び出されます。 _start()はmain()、BTWを呼び出します。とにかく、このコードは信号を親に送ります。 –

+0

@jimmcnamara: 'SIGCHLD'はカーネルによって送信されます。 – ninjalj

2

前景の子供のようなものはありません。バックグラウンドプロセスという用語は、主に親プロセス(主に、子プロセスを作成してその仕事を行うプロセス)を扱っていることを指すのに使用されます。子プロセスが終了すると、常に親プロセスに送られます。SIGCHLDしかし、親プロセスは通常それを無視します。親が子プロセスの終了を処理したい場合や、子プロセスの終了後に何らかのアクションを行う場合は、wait()システムコールを使用して子プロセスのステータスを取得できます。

関連する問題