SIGCHLDに反応して子プロセスのゾンビを償却する関数。

まずは関数の仕様から説明。
signal関数は、シグナルをきっかけとして動作する関数を登録するための関数。第一引数に「反応するシグナル番号」を入れ、第二引数には「返す型がvoidで引数がintひとつの関数へのポインタ」を入れる。これをメイン関数などに入れておくことで、シグナルが来たときに反応する関数を指示できたことになる。
関数の詳細は BohYoh.com【C言語講座】標準ライブラリ signal など参照のこと。
waitpid関数は、子プロセスがゾンビになるまで待つ関数。ただし、設定次第で既にゾンビになっているプロセスだけ殺せるようにもなるので、今回はその方法で使う。第一引数は詳細はhttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/wait.2.htmlを参照いただくとして、『子プロセスのいずれかが終了するのを待つ』に対応する"-1"を使うと良い。第二引数にintへのポインタを入れると、帰ってきた値からこの関数の動作状態について知ることが出来る。知る必要がなければNULLで良い。第三引数にはWNOHANGを入れることで、止まっている子プロセスが無い場合にすぐに復帰するよう指定することが出来る。


以上、まとめると下のような胡散臭いプログラムを書くことが出来る。

#include <sys/wait.h>
#include <signal.h>

void wait_for_signal(int signo){
  while( 0 >= waitpid(-1, NULL, WNOHANG) );
}

int main( void ){
/* 中略 */
  signal(SIGCHLD, wait_for_signal);
/* 後略 */
}

while文のあたりがとりわけうさんくせぇ。


ダブルフォークすればこの辺のことしなくて済むから楽なんじゃね?じゃね?
そもそもスレッドを使った方がいいらしいので(ホントか??)、この次の多重化はPOSIXスレッドでやってみます。
参考URL
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/wait.2.html
http://www.bohyoh.com/CandCPP/C/Library/signal.html
http://hp.vector.co.jp/authors/VA003991/kouza/senior/kouza_socket.html
http://www.ipa.go.jp/security/awareness/vendor/programming/b07_04_main.html