理系学生日記

おまえはいつまで学生気分なのか

ゾンビプロセス

子プロセスが終了したときに親プロセスが wait システムコールを呼び出していないとき、子プロセスはゾンビプロセスになる。ps コマンドでは、ゾンビプロセスのステータスは Z と表示される。
一方、親プロセスが wait を呼び出さずに終了したときは、子プロセスは init プロセスに引き継がれる。init プロセスは自動的にゾンビプロセスを回収する。

exit システムコールは任意の子プロセスが終了するまで block するが、子プロセスの回収を非同期に行いたいときにはどうするか。
一つの方法は wait3 や wait4 システムコールを繰り返し呼び出すことである。wait3 や wait4 は 1 つ追加の引数を取り、このフラグに WNOHANG を渡すことで、wait3 (あるいは wait4) はブロックしなくなる。

よりエレガントな方法としては、子プロセスの終了を親プロセスに通知するというものがある。プロセス間通信でも可能であるが、Linux はシグナルを用いて同様のことを行うことができる。Linux では子プロセスが終了すると親プロセスに対して SIGCHLD シグナルを送出する。このシグナルに対するデフォルトの動作は「何もしない」である。そのため、子プロセスを回収する簡便な方法は、SIGCHLD シグナルのハンドリングである。