关于Linux下子进程回收的问题。

xcyylp 2017-12-15 11:34:26
关于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;
}


...全文
290 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhxianbin 2017-12-15
  • 打赏
  • 举报
回复
那就不用默认处理方式
xcyylp 2017-12-15
  • 打赏
  • 举报
回复
5个子进程同时退出,会同时发SIGCHLD。但是这个信号是可能会丢失的(同时处理的话)。 就是sig_handle不能调用5次。就导致有的进程无法wait到。

18,772

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧