子プロセスが停止または終了すると、SIGCHILD が親プロセスに送られます。このシグナルへのデフォルトの応答は無視することです。このシグナルをキャッチでき、すぐに wait(2) および wait3(3C) を呼び出して、子プロセスからの終了ステータスを得ることができます。こうすると、ゾンビプロセスのエントリをできるだけ素早く削除できます。例 4-2 は、SIGCHILD をキャッチするハンドラのインストールを示しています。
#include <stdio.h> #include <signal.h> #include <sys/wait.h> #include <sys/resource.h> void proc_exit() { int wstat; union wait wstat; pid_t pid; while (TRUE) { pid = wait3 (&wstat, WNOHANG, (struct rusage *)NULL ); if (pid == 0) return; else if (pid == -1) return; else printf ("Return code: %d¥n", wstat.w_retcode); } } main () { signal (SIGCHLD, proc_exit); switch (fork()) { case -1: perror ("main: fork"); exit (0); case 0: printf ("I'm alive (temporarily)¥n"); exit (rand()); default: pause(); } } |
SIGCHILD をキャッチャするハンドラは、通常はプロセス初期化の一部として設定します。これらは、子プロセスをフォークする前に設定しなければなりません。典型的な SIGCHILD ハンドラは、子プロセスの終了状態を検索します。