親プロセスが子プロセスの終了を検知するために、シグナルハンドラ内部で
SIGCHLDを捕捉して、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を吐いて終わります。
説明が下手で意味がわからないかもしれませんが…知っている方がいましたら教えて下さい。