Unix では、バックグラウンドの子プロセスが終了すると、SIGCHLD
終了したことを知らせるシグナルを親プロセスに送信します。
プロセスがフォアグラウンドにあった場合でも同じことが起こりますか? もしそうなら、これは親がそれを無視することを意味します。
これは正しいですか?または、フォアグラウンドにある場合、信号はまったく送信されませんか?
background と foreground はジョブ制御の概念であり、シェルの一部です。それらはプロセスに適用され、別のプロセスを生成 (実行) したプロセスには影響しません。
子プロセスは fork()-exec() 呼び出しの結果です。子プロセスは、fork() 呼び出しを実行したプロセスの親 pid を取得します。これは SIGCHLD シグナルのコンテキストであり、親 pid は SIGCHLD シグナルを受け取ります。子プロセスが「フォアグラウンド」であるか「バックグラウンド」であるかは関係ありません。プロセスの終了時に重要なのは ppid だけです。
前の子なんてものはありません。バックグラウンド プロセスという用語は、主に親プロセス (ジョブの一部を実行するために子プロセスを作成する場合があります) を処理していることを示すために使用されます。子プロセスが終了するSIGCHLD
と、常に親プロセスに送信されます。ただし、通常、親プロセスはそれを無視します。親が子の終了を処理したい場合、または子の終了後にのみ何らかのアクションを実行したい場合は、wait()システム コールを使用して子プロセスのステータスを取得できます。