详解wait/waitpid的参数:status

关于 wait 与 waitpid 中的参数:status

用到的代码:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<sys/wait.h>
  5 int main()
  6 {
  7   pid_t pid = fork();
  8   if(pid < 0)
  9   {
 10     perror("fork error");
 11     return -1;
 12   }
 13   else if(pid == 0)
 14   {
 15     sleep(3);                                                                                                                                                                                                                       
 16     exit(1);
 17   }
 18   int status;
 19   while(waitpid(-1,&status,WNOHANG) == 0)//为了等待子进程退出 
 20   {
 21     printf("先打一会儿篮球,再去买水喝\n");
 22     sleep(1);
 23   }
 24   if(status & 0x7f)//子进程异常退出时才会进入,这时的(status & 0x7f)>0.
 25   {
 26     printf("program error!\n");
 27     return -1;
 28   }
 29   printf("exit child code:%d\n",((status >> 8)&0xff));
 30   while(1)
 31   {
 32     printf("------\n");
 33     sleep(1);
 34   }
 35   return 0;
 36 }

status 参数是一个输出型参数,由操作系统填充。 如果传递NULL,表示不关心子进程的退出状态信息。如果不为空, 操作系统会根据该参数,将子进程的退出信息反馈给父进程。

虽然 status 是一个 int ,但是它的高两个字节根本没有用到,所以我们只研究status低16位。在低16位中,其中:

  • status的低16位的高8位保存子进程的返回值,如果我们想要获取子进程的返回值,就是说要获取低16位的高八位。(如果子进程正常退出(exit) —则高8位是子进程的返回值,低8位中的低7位是0)
    在这里插入图片描述
    为了验证子进程正常退出时候的高8位的返回值 与 低7位的值(此时是 0):
    在这里插入图片描述

  • status的低16位的低8位中保存子进程异常退出的信号值,其实也只用到了其中的低7位,如果我们想要获取子进程的异常退出信号值,就是说要获取低16位的低7位。(如果子进程异常退出—则高8位的子进程的返回值是0,低8位中的低7位的异常退出信号值不为0)

    为了验证子进程异常退出时低7位所给出的结果,在程序运行后,我将 kill 子进程,程序的运行后结果为:
    在这里插入图片描述

  • 上述是我们分析的过程,但是为了更加方便我们获取子进程退出的返回值,系统给我们提供了宏函数来更加方便的获取;
    在这里插入图片描述
    子进程正常退出,获取返回值为 1:
    在这里插入图片描述
    可见,这样获取更加方便!!!

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值