解决多进程中使用wait无法避免僵尸进程的方案
16lz
2021-01-22
我想到了有几个方案,大致如下:
一是用信号量,由于wait是阻塞函数,所以这里用waitpid,并且设置参数NOWHANG,这样waitpid就不是阻塞的了。
具体实现如下:
int main() {
int count=0;
int i;
pid_t pid;
signal(SIGCHLD, wait4children);
for(i=0; i<100; i++) {
pid = fork();
if(pid == 0){
count++;
break;
}
}
if(pid>0) {
printf("press Enter to exit...");
getchar();
}
return 0;
}
void func_waitpid(int signo) {
pid_t pid;
int stat;
while( (pid = waitpid(-1, &stat, WNOHANG)) > 0 )
{//如果使用了WNOHANG参数调用waitpid,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去。
printf( "child %d exit\n", pid );
count--;
if(count==0)
{
break;
}
}
return;
}
还有一种实现,不调用wait,在父进程中设置条件,未满足条件的时候pause父进程。
int iChildCount = 0;
int ProcChildEnd(int iSigNo);
int main()
{
pid_t pid;
int i = 10;
signal(SIGCHLD, ProcChildEnd);
//take fork 10 child processes for example, you can fork any amount child processes as you want
while(i--)
{
pid = fork();
if (pid == 0)
{
//child;
}
else if (pid > 0)
{
iChildCount++;
}
else
{
//error;
}
}
//block untill all child process have been ended
while(iChildCount > 0)
{
pause();
}
//All child have been ended, start to do anything you want
return 0;
}
int ProcChildEnd(int signo)
{
iChildCount--;
return 0;
}
更多相关文章
- IO流在fork()的ed进程中
- jmap使用以及 linux下查看进程的内存使用情况
- Linux daemon进程的应用、实现和原理
- linux usb枚举过程分析之守护进程及其唤醒【转】
- 进程间通讯概述
- 转:——Windows和Linux进程间通信区别
- linux内核模块的强制删除-结束rmmod这类disk sleep进程
- linux进程和线程排查 · 记一次JVM CPU高负载的排查办法
- Linux内存占用分析 进程内存空间