UNIXプログラミング質問すれ Part4
■ このスレッドは過去ログ倉庫に格納されています
0600デフォルトの名無しさん
NGNGSIGCHLDを捕捉して、waitpid()を実行するように実装しました。
void signlahandler(int signum)
{
signal(signum, signlahandler); //☆
if(signum == SIGCHLD)
waitpid(0, NULL, WNOHANG);
//★
}
しかし、☆でシグナルハンドラの再設定すると、その時点でさらにSIGCHLDを
受信してしまい、延々とsignalhandler関数が呼び出されて
スタックオーバーフローとなりCoreを吐いてプロセスが異常終了してしまいます。
HPUXとAIXでこの現象が発生し、HPUXのmanのwaitpid()にはこの事が
書かれていました。正常に動作させるためには★の位置でシグナルハンドラの再設定を
しなければならないのですが、なぜこのような仕様なのでしょうか?
ちなみにAIXでは、waitpid()を実行せずに、★か☆の位置で再設定すると
同様にCoreを吐いて終わります。
説明が下手で意味がわからないかもしれませんが…知っている方がいましたら教えて下さい。
■ このスレッドは過去ログ倉庫に格納されています