【Linux】wait和waitpid的区别

先来看一下这两个函数的函数原型
这里写图片描述
这两个函数的功能都是回收已经退出的子进程的资源,获取子进程的退出信息,防止出现僵尸进程。
先来看wait函数:
函数参数:输出型参数,获取子进程退出状态,不关心则设置成NULL
返回值:
成功返回被等待进程id,失败返回-1
再来看waitpid函数:
函数参数:
pid:
pid=-1,等待任意一个子进程,和wait等效
pid>0:只等待进程id等于pid的进程
pid=0:等待同一进程组的任意一个进程,如果子进程加入其他进程组不加理会
pid<-1时,等待一个指定进程组中的任意一个进程,这个进程组的id就是pid的绝对值
status:
WIFEXITED 若为正常终止子进程返回的状态,则为真,(查看进程是否正常退出)
WEXITSTATUS:若WIFEXITED 非零,提取子进程退出码(查看进程退出码)
options:
WNOHANG:若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回孩子进程的进程id
返回值:
正常返回的时候返回等待进程的进程id
如果设置了第三个参数WNOHANG,waitpid发现没有自己可收集的子进程,则返回0
调用出错返回-1,errno也被设置成相应值来指示错误所在
将两个函数分别介绍完之后,来总结一下这两个函数的区别和联系:
从本质上讲,wait和waitpid的作用是完全相同的,但是waitpid多了两个参数,从而使我们的编程能更加的灵活。
waitpid有wait没有的三个功能:
(1)waitpid能等待一个特定的子进程,而wait只能等待任意的子进程,
(2)系统一旦调用wait函数就会阻塞父进程来等待,直到等到子进程的退出才停止阻塞,而waitpid提供了一种非阻塞方式的等待,也就是第三个参数,当第三个参数设置为WNOHANG,当子进程没有结束,直接返回0,不等待
(3)waitpid支持作业控制,提供用于检查wait和waitpid返回状态的宏这两个函数返回的子进程的状态都保存在status指针中
WIFEXITED(status): 若为正常终止, 则为真. 此时可执行 WEXITSTATUS(status): 取子进程传送给exit或_exit参数的低8位.
WIFSIGNALED(status): 若为异常终止, 则为真.此时可执行 WTERMSIG(status): 取使子进程终止的信号编号.
WIFSTOPPED(status): 若为当前暂停子进程, 则为真. 此时可执行 WSTOPSIG(status): 取使子进程暂停的信号编号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值