- SIGCHLD と ZOMBIE プロセス
waitpid を while でまわす理由†
今北産業†
- 子プロセスが死んだ場合に zombie にならないよう SIGCHLD に合わせて wait を(一度)呼ぶコードをよくみる (waitpid でも一度しか呼ばない場合は同じ事)
- そして、沢山作った子プロセスが一斉に死んだ場合に、SIGCHLD がその数より少ない数しか発行されなくて、wait を呼ぶ数が追いつかなくなり、zombie だらけになる事が、多々ある
- 非ブロック型の wait (waitpid とか、古いのだと wait3 とか)を(zombie の子プロセスを処理しきるまで) while でまわすだけで解決できるので、お勧め。
図にしてみた†
- wait で大丈夫な例
parent process wait wait wait ----------------------------------- child process 1 ↑SIG ↑SIG ↑SIG ---------------X CHLD ↑CHLD ↑CHLD child process 2 ↑ ↑ ----------------------X ↑ child process 3 ↑ -----------------------------X
- wait でダメな例
parent process wait ------------------------- child process 1 ↑SIGCHLD -----------------------X (一度しか発行されない事がある) child process 2 ↑ この場合、2つのプロセスが zombie として残る -----------------------X child process 3 ↑ -----------------------X
- waitpid を while で回す例
parent process while(waitpid != 0) ------------------------- ↑3回まわる child process 1 ↑SIGCHLD -----------------------X (一度しか発行されない事がある) child process 2 ↑ -----------------------X child process 3 ↑ -----------------------X