Top > SIGCHLD
  • The added line is THIS COLOR.
  • The deleted line is THIS COLOR.
  • Go to SIGCHLD.

- SIGCHLD と ZOMBIE プロセス
--  http://diary.awm.jp/~yoya/?20021230#200212302

* 今北産業 [#c43533fd]
* waitpid を while でまわす理由 [#waitpid]

** 今北産業 [#c43533fd]

- 子プロセスが死んだ場合に zombie にならないよう SIGCHLD に合わせて wait を(一度)呼ぶコードをよくみる (waitpid でも一度しか呼ばない場合は同じ事)
- そして、沢山作った子プロセスが一斉に死んだ場合に、SIGCHLD がその数より少ない数しか発行されなくて、wait を呼ぶ数が追いつかなくなり、zombie だらけになる事が、多々ある
- 非ブロック型の wait (waitpid とか、古いのだと wait3 とか)を(zombie の子プロセスを処理しきるまで) while でまわすだけで解決できるので、お勧め。

* 図にしてみた [#b16c4405]
** 図にしてみた [#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

Reload   Diff   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes