深入理解进程(六)——进程等待

一、进程等待的作用

父进程等待子进程退出,获取子进程的返回值,避免产生僵死进程。

二、如何实现进程等待
(1)wait函数

1. 函数原型:

pid_t wait(int *status)该函数是一个阻塞函数,功能是等待任意一个子进程退出。

2. 参数说明:

status:用于获取退出原因

3. 返回值:

返回值是退出的子进程的ID

(2)waitpid函数

1. 函数原型:

pid_t waitpid(pid_t pid,int* status,int options)
可以等待任意一个子进程退出或者等待指定子进程退出

2. 参数说明:

  1. pid:

    -1: 等待任意子进程退出

    >0: 等待指定的子进程退出

    1. status:

      ​ 用于获取退出原因

  2. options:

0: 默认为阻塞

WNOHANG: 将waitpid设置为非阻塞

​ 4. 返回值: 函数的返回值只用了一个字节来接收,这一点要注意

-1: 错误

0: 有子进程,但是没有等到子进程退出

子进程的pid: 等到了子进程退出,返回退出子进程的pid

列举一种非阻塞的使用方法:while(waitpid(-1,NULL,WNOHANG)==0),如果没有子进程退出就一直等待。

三、阻塞与非阻塞

阻塞:为了完成功能,发起调用,如果当前不具备完成条件,则一直等待,直到完成后才返回。

非阻塞:为了完成功能,发起调用,如果当前不具备完成条件,则立即报错返回。

阻塞与非阻塞的区别:调用功能不具备完成条件时,是否立即返回。

非阻塞对于阻塞来讲对CPU的利用更加高效,因为它不需要等待,但是他需要进行循环操作才可以

四、子进程退出原因

子进程的退出原因,通常保存在stasus中。虽然status是一个4字节的int,但是实际上仅仅使用了一个字节去保存退出原因,也就是说其余三个字节是没有的,这同样意味着,退出原因最大不能超过255。

status分析

在这里插入图片描述

对于status来说,4个字节,32位的空间。其中高16位丢弃不用,子进程的退出返回值保存在低16中的高8位,其余的如上图所示。

如何获取子进程的返回值?

如果程序异常退出: 那么它的退出返回值就豪无参照意义,没必要获取
如果正常退出: 那么低7位就为0,所以如果低7位为0,就说明可以获取返回值。
代码如下:

if((statu & 0x7f)==0)       //如果低7位为0,就说明可以获取返回值
(statu >>8) & 0xff;   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值