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