子进程的异步等待方式

一.SIGCHLD

   SIGCHLD信号:当子进程退出时,它会向父进程发送SIGCHLD信号,该信号的默认处理方式为忽略,当父进程以阻塞方式等待时,它不能处理自己的工作。
   我们自定义一个捕捉信号的函数catchsig。

代码如下:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

void catchsig(int sig)
{
   printf("get a sig:%d,pid:%d\n",sig,getpid());
}

int main()
{
   signal(SIGCHLD,catchsig);
   pid_t id=fork();
   if(id==0)
   {//child
      printf("I am child,quit! pid:%d\n",getpid());
      exit(1);
   }
   else
   {//father
     waitpid(id,NULL,0);//以阻塞方式等待
   }
   return 0;
}

结果如图所示:
这里写图片描述

子进程退出,向父进程发送信SIGCHLD,父进程会调用SIGCHLD的捕捉函数。

二. 父进程等待子进程的异步方式

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

代码如下:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

void catchsig(int sig)
{
   do
   {
      pid_t ret=waitpid(-1,NULL,WNOHANG);//-1表示可以回收任何进程,WNOHANG表示非阻塞方式等待
      if(ret>0)
      {
         printf("wait success:%d\n",ret);
      }
      else
      {
         printf("wait filed:%d\n",ret);
         break;
      }
   }while(1);
}

int main()
{
   signal(SIGCHLD,catchsig);
   pid_t id=fork();
   if(id==0)
   {//child
      printf("I am child,quit! pid:%d\n",getpid());
      exit(1);
   }
   else
   {//father
      while(1)
      {
          printf("do father things!\n");
          sleep(1);
      }
   }
   return 0;
}

结果如下:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值