を使用してコマンドを実行する子プロセスをフォークしていexecve
ます。次のように、SIGCHLD、SIGINT、およびSIGSTPの3つのシグナルハンドラーをインストールして定義しています。
void sigchld(int sig)
{
while((pid=waitpid(-1,&stat,WNOTRACE|WNOHANG))>0)
{
if(WIFEXITED(stat))
//normal exit: Delete child from job list
if(WIFSIGNALED(stat))
//interrupted by signal: delete job from job list
if(WIFSTOPPED(stat))
//Stopped: put child in background
}
}
//SIGINT Handler:
kill(-pid,sig)
//SIGSTOPPED Handler:
kill(-pid,sig)
ここで、プロセスを実行してバックグラウンド (ctrl z) でループ (100 回) すると、ほとんどの場合、エラーが発生します。waitpid error: Interrupted system call
なぜ私はこれを手に入れたのですか?