POSIXシグナル2

同じシグナルがほぼ同時に複数配送される場合

シグナルハンドラを設定してwaitを呼び出すだけでは、ゾンビ防止には不十分。Unixのシグナルはキューイングされないために、シグナルが発生した数だけ、シグナルハンドラが実行されない場合があるから。
正しい解決方法は、waitの代わりにwaitpidを呼び出すこと。

//waitpidを呼び出すシグナルハンドラ
void
sig_child(int signo)
{
  pid_t pid;
  int stat;
  while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0)
    printf("child %d terminated\n", pid);
  return;
}

ネットワークプログラミングで遭遇する3種類の状況

  • 1.子プロセスをforkするプログラムでは、SIGCHLDシグナルを捕捉しなければならない。
  • 2.シグナルを捕捉する場合は、システムコールへの割り込みを処理しなければならない。
  • 3.SIGCHLDのシグナルハンドラは、ゾンビが残るのを防止するために、waitpidを用いて正しく処理することができる。

    参考文献

  • UNIXネットワークプログラミング スティーブンズ