子进程的异步等待方式

来源:互联网 发布:空性智慧知乎 编辑:程序博客网 时间:2024/06/18 15:14

SIGCHLD,在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。

#include<stdio.h>#include <sys/types.h>#include <sys/wait.h>#include<signal.h>void myhandler(int sig){     printf("i am get a sig:%d\n",getpid());}int main(){     int i=0;     signal(SIGCHLD,myhandler);     if(fork()==0)     {          printf("i am child:%d\n",getpid());          exit(1);     }     else     {         wait(NULL);         printf("i am father:%d\n",getpid());     }     return 0;}

这里写图片描述

但是这样只处理了一个僵尸进程
假如有多个僵尸进程呢,因为收到多个信号,但是只记录一次因此需要循环回收.
因为如果是9个子进程都退出了,还有一个没有退出,但必须也要在最后一个退出的时候给父进程发送一个sigchild信号因此要是非阻塞的

#include<stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>#include<signal.h>void myhandler(int sig){   do    {    pid_t ret=waitpid(-1,NULL,WNOHANG);    if(ret>0)    {        printf("wait success i am get a sig:%d\n",sig);    }    else    {        printf("wait faiured!\n");        break;    }    }   while(1);}int main(){    int i=0;    signal(SIGCHLD,myhandler);    if(fork()==0)    {        printf("i am child:%d\n",getpid());        exit(1);    }    else    {        while(1)        {            printf("i am father,i do myself things\n");             sleep(1);    }    }    return 0;}

这里写图片描述

原创粉丝点击