父进程异步等待子进程

来源:互联网 发布:高性能linux服务器 编辑:程序博客网 时间:2024/06/04 19:01

父进程自定义SIGCHLD信号的处理函数,并采用非阻塞方式等待,当子进程退出时,会向父进程发送信号,父进程会进行回收。
当有10个子进程退出时,会给父进程发送10个信号,但由于只会记录一次,所以只能回收一次,我们让父进程一直回收,当子进程全部被回收,waitpid()返回-1,跳出循环。

#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/wait.h>#include <signal.h>void catchsig(int sig){    do    {        pid_t ret = waitpid(-1, NULL, WNOHANG);        if(ret > 0)        {            printf("wait success:%d\n", ret);        }            else         {            printf("wait failed:%d\n", ret);            break;        }    }    while(1);}//验证子进程退出时会给父进程发送信号/*void catchsig(int sig){    printf("i am %d signal\n", sig);}*/int main(){    signal(SIGCHLD, catchsig);    pid_t id = fork();    if(id == 0)    {        printf("i am child ,quit!pid:%d\n", getpid());        exit(1);    }    else    {        while(1)        {            printf("i am father,runing!\n");            sleep(1);        }    }    return 0;}

这里写图片描述
因为只有一个子进程,所以只会等待一次。

原创粉丝点击