解决多进程中使用wait无法避免僵尸进程的方案

来源:互联网 发布:上海淘宝模特兼职招聘 编辑:程序博客网 时间:2024/05/16 06:00

我想到了有几个方案,大致如下:

一是用信号量,由于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;}


0 0
原创粉丝点击