- 追加された行はこの色です。
- 削除された行はこの色です。
- 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