关于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;
}
如下面的代码所示,主进程处理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;
}
解决方案 »
- Requires: libpython2.4.so.1.0()(64bit)
- centos 7安装网易云音乐有点小毛病
- C语言正则表达式匹配中文
- linux socket网络 绑定失败 bind errorInvalid argument
- 安装centos遇到的问题
- 〖求助〗自己电脑安装了VMware和Ubuntu
- 自从在装上虚拟机电脑上网就不能用了。求大佬指点一下
- 安装centos 7的时候出现An Unknown Error Has Occurred
- Linux问题
- 【已解决】安装svn提示Expat not found。
- linux下find命令查找文件诡异事件
- bash shell /dev/tcp建立socket连接时 如何将错误信息隐藏
就是sig_handle不能调用5次。就导致有的进程无法wait到。