• 締切済み

forkで子が親を終了させるか?

fork() によって作られた子プロセスが、親プロセスを終了させる場合があるでしょうか? 形としては良く見かけるもので次のようになっています。 pid_t pid = fork(); if (pid < 0) {  エラー処理  return; } else if (pid == 0) {  子の処理 ... (1)  _exit(0); } /* ここが実行されない場合がある */ return; (1)の箇所に sleep() を幾らか入れると再現しなくなります。 親子の関係で子が親へ影響を与えることがあるでしょうか?

みんなの回答

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

>この部分は問題ないと思っているのですが、少しコードを変形してみようと思います。 return文に来ないのに、親プロセスが終了しているのは、 明示的にどこかでexitしているのではないかと思ったのですが、 (それがSIGCHLDのハンドラ内だと思った) 再現性があるのなら、SIGCHLDをハンドリングしないようにして return文に来るようになるかどうか、確認したほうがいいと思います。 コードを修正する前に。

davidfox
質問者

お礼

時間が掛かりそうなので、ここで締め切りたいと思います。 有難うございました。

davidfox
質問者

補足

>再現性があるのなら、SIGCHLDをハンドリングしないようにして 何か可能性があると言うことでしょうか?

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

子の状態が変化したときに飛ばす、シグナル:SIGCHLD を親が受け取って、処理しているのではないですか? http://www.csg.is.titech.ac.jp/~chiba/lecture/web/web03.html

davidfox
質問者

補足

ご意見ありがとうございます。 SIGCHLDのハンドラはありますが、 waitpid(-1, &status, WNOHANG); のようにゾンビ対策のみです。  この部分は問題ないと思っているのですが、少しコードを変形してみようと思います。

関連するQ&A