首先问题是由于重新设定signal引起的,因为改变默认SIGCLD信号处理方式的时候,内核会去检测有无子进程需要被等待,所以在子进程里重新设定SIGCLD的处理方式时,肯定有子进程在等待,因为都已经触发进到signal的处理函数里面了。所以肯定有子进程在被等待。导致内核循环检测到SIGCLD信号。
for example
#include"apue.h"
#include <sys/wait.h>
void sig_cld (int);
int main(void)
{
pid_t pid;
if( signal(SIGCLD,sig_cld) == SIG_ERR)
perror("signal error.");
if( ( pid = fork() ) <0 )
perror("fork error.");
else if ( pid == 0)
{
sleep(2);
_exit(0);
}
pause();
exit(0);
}
void sig_cld (int signo)
{
int status;
pid_t pid;
printf("catched SIGCLD\n");
if( signal(SIGCLD,sig_cld) == SIG_ERR)
perror("signal error.");
if( (pid = wait (&status)) < 0 )
perrpr("wait error.");
printf("pid = %d\n",pid);
}
解决方法:将子进程里的signal(SIGCLD,sig_cld) == SIG_ERR)移动到wait之后。