Top > SIGCHLD - SIGCHLD と ZOMBIE プロセス -- http://diary.awm.jp/~yoya/?20021230#200212302 * waitpid を while でまわす理由 [#waitpid] ** 今北産業 [#c43533fd] - 子プロセスが死んだ場合に zombie にならないよう SIGCHLD に合わせて wait を(一度)呼ぶコードをよくみる (waitpid でも一度しか呼ばない場合は同じ事) - そして、沢山作った子プロセスが一斉に死んだ場合に、SIGCHLD がその数より少ない数しか発行されなくて、wait を呼ぶ数が追いつかなくなり、zombie だらけになる事が、多々ある - 非ブロック型の wait (waitpid とか、古いのだと wait3 とか)を(zombie の子プロセスを処理しきるまで) while でまわすだけで解決できるので、お勧め。 ** 図にしてみた [#b16c4405] - 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 |