[Linux]关于SIGCHLD

来源:互联网 发布:淘宝美胸第一名 编辑:程序博客网 时间:2024/05/19 02:39

之前我们就学过,关于wait和waitpid来处理僵尸进程,父进程等待子进程结束后自己才退出,这样的方法有俩种方式,一种是父进程死死的等子进程退出,也就是使用阻塞的方式等待子进程退出,另一种方式是通过非阻塞的方式,即轮询的方式,这样父进程就可以不用浪费时间一直在那里等子进程退出,而是可以自己干自己的事,过段时间访问一次看子进程退出没,没退出的话干自己的,退出的话则回收子进程,并且自己也随即退出。那么我们是如何知道子进程是否退出呢。其实在这里,子进程终止后会给父进程发送一个SIGCHLD信号,很多同学会想,也没有见过这个信号呀,是因为这个信号的处理方式操作系统默认为忽略的方式处理的,如果你想要知道那个信号,那就用我们学过的让它的处理方式为用户自定义的处理函数即可啦。下面编写一个代码来验证一下子进程终止确实是会给父进程发送SIGCHLD信号的。

#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<signal.h>void myhandler(int sig){    printf("my sig is %d\n",sig);}int main(){    pid_t id = fork();    signal(SIGCHLD,myhandler);    if(id == 0)//child    {        printf("i am child!pid:%d\n",getpid());        sleep(5);        exit(1);    }    else //father    {        while(id = waitpid(id,NULL,0) > 0)        {            printf("wait child success:%d       pid:%d\n",id,getpid());        }        printf("child is quit!%d\n",getpid());    }    return 0;}

运行结果:

这里写图片描述

等待子进程5秒之后:(发送了一个信号17)

这里写图片描述

我们可以看一下这个17号信号是什么:(kill -l命令)

这里写图片描述

对,就是那个SIGCHLD信号。

我们之前用sigaction来捕捉信号,当然我们也可以使用sigaction来捕捉SIGCHLD信号,在这里对于这个例子来说也叫做父进程等待子进程的异步版本,具体实现如下:

#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<signal.h>void myhandler(int sig){    printf("my sig is %d\n",sig);}int main(){    signal(SIGCHLD,myhandler);    pid_t cid;    if((cid = fork())== 0)//child    {        printf("i am child!pid:%d\n",getpid());        sleep(5);        exit(1);    }    else    {        struct sigaction act;           act.sa_handler = myhandler;        sigemptyset(&act.sa_mask);        act.sa_flags = 0;        sigaction(SIGCHLD,&act,NULL);        while(1)        {            printf("i am parent,my pid is %d\n",getpid());            sleep(1);        }    }//  else //father//  {//      while(id = waitpid(id,NULL,0) > 0)//      {//          printf("wait child success:%d       pid:%d\n",id,getpid());//      }//      printf("child is quit!%d\n",getpid());//  }    return 0;}

运行结果:

这里写图片描述

当子进程运行5秒后,sigaction函数捕捉到SIGCHLD信号,也即子进程退出的信号,然后父进程运行。

原创粉丝点击