关于Linux下子进程回收的问题。
如下面的代码所示,主进程处理SIGCHLD这个信号,信号处理函数中waitpid子进程。主进程忽略SIGINT,然后创建5个子进程,子进程默认方式处理SIGINT。
程序跑起来之后,按下Ctrl+c。5个子进程全部退出。问题来了:由于子进程同时退出,导致sig_handle不能同时处理5个信号。所以总会有两三个进程仍然是僵尸进程。
对于这种情况该如何处理。?
还是实际应用中几乎不会存在这种同时退出的情况呢?
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/wait.h>void sig_handle(int sig)
{
int ret = 0;
printf("%s() +++\n", __func__);
#if 0
wait(NULL);
#else
while(ret = waitpid(-1, NULL, WNOHANG))
{
if(ret < 0)
{
printf("waitpid failed\n");
}
else
{
printf("waitpid success\n");
break;
}
}
#endif
}int main()
{
//signal(SIGCHLD, SIG_IGN);
signal(SIGINT, SIG_IGN); // 主进程忽略这个信号
signal(SIGCHLD, sig_handle); pid_t fpid[5];
int i = 0;
for(i = 0; i < 5; i++)
{
fpid[i] = fork();
if(fpid[i] < 0)
{
perror("fork");
return -1;
}
else if(fpid[i] == 0)
{
signal(SIGINT, SIG_DFL); // 子进程默认方式处理这个信号
printf("This is child process, id:%d, my father:%d\n", getpid(), getppid());
getchar();
return 0;
}
else
{
printf("This is parent process, id:%d\n", getpid());
}
}

getchar();
printf("main() ------\n");
return 0;
}