wait与waitpid函数

函数的定义

   #include <sys/wait.h>
   pid_t wait(int *wstatus);
   pid_t waitpid(pid_t pid, int *wstatus, int options);
wait函数
  pid_t wait(int *wstatus);

int *wstatus:传出参数,如果不关心子进程结束的原因,那么直接传NULL进去即可
返回值:
成功:返回回收进程的ID
失败:返回-1

waitpid函数
pid_t waitpid(pid_t pid, int *wstatus, int options);

waitpid函数与wait函数的功能基本相同,但是waitpid函数可以回收指定的进程,并且可以设置是否阻塞。
参数1:
pid>0 指定回收进程的ID
pid=-1 回收任意进程(和wait函数一样)
pid=0 回收和当前调用waitpid一个组的所有进程
pid<0 回收指定组内所有的进程

参数2:
传出参数,可以通过传出参数获取子进程的传出状态

参数3:
如果设置WNOHANG表示不阻塞等待子进程
如果设置为0表示阻塞等待

wait函数与waitpid函数:

1.wait函数与waitpid函数一次调用均只能回收一个子进程,要想回收多个需要用while循环
2.通过上面的讨论可以得出 wait(&status)==waitpid(-1,&status,0),因此是可以用waitpid函数去替代wait函数的。

案例1:
用wait函数回子进程,并获取子进程的结束准备状态

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

int main()
{

  pid_t pid,wpid;
  int status;

  pid=fork();
  if(pid==0)
  {
    //子进程
    printf("I am child,my pid is %d,I am going to sleep 10s\n",getpid());
    sleep(10);
    printf("Child is  die\n");
    return 77;
  }else if(pid>0){
    //父进程
    wpid=wait(&status);
    if(wpid==-1)
    {
      perror("wait error");
      exit(1);
    }
    printf("parent wait the %d child process\n",wpid);
    if(WIFEXITED(status))
    {
      printf("child exit with %d\n",WEXITSTATUS(status));//获取退出状态
    }
    if(WIFSIGNALED(status))
    {
      printf("child exit with siganl %d\n",WTERMSIG(status));
    }


  }else{
    perror("fork error");
    exit(1);
  }
  return 0;
}

运行结果

I am child,my pid is 1063478,I am going to sleep 10s
Child is  die
parent wait the 1063478 child process
child exit with 77

案例2:
首先用fork循环创建5个进程然后回收第三个进程

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


int main()
{
  pid_t wpid,pid,tmid;
  int status,i;
  for(i=0;i<5;i++)
  {
    pid=fork();
    if(pid==0){
      break;
    }
    if(i==2)
    {
      tmid=pid;
      printf("pid=%d\n",tmid);
    }
 }
  if(i==5)
  {
      sleep(5);
     //父进程
     wpid=waitpid(tmid,&status,WNOHANG);
     if(wpid==-1)
     {
       perror("wait error");
       exit(1);
     }
     printf("I am parent ,wait a child finish:%d\n",wpid);
  }
  return 0;
}

运行结果:

pid=1064307
I am parent ,wait a child finish:1064307

案例3:
利用非阻塞和阻塞两种方式回收子进程

/*
 * 回收多个子进程
 * */
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>

int main()
{
  //1.循环创建5个进程
  int i;
  pid_t pid,wpid;

  for(i=0;i<5;i++)
  {
    pid=fork();
    if(pid==0)
      break;
  }

  if(i==5)
  {
    //进入父进程当中
    //2.阻塞式回收
   // while(wpid=waitpid(-1,NULL,0))
    //  printf("parent waitpid child :%d\n",wpid);
    //3. 非阻塞式回收
    while((wpid=waitpid(-1,NULL,WNOHANG))!=-1)
      if(waitpid>0)
      {
        printf("wait child %d\n",wpid);
      }else if(wpid==0)
      {
        sleep(2);
        continue;
      }
  }
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值