orange's学习--第十章:exit()和wait()

让进程死亡的系统调用叫做exit(),直译作“退出”,其实它叫“自杀”更贴切,因为exit()通常是由要进程自己调用的,而且调用之后这个进程不是“退出”了,而是干脆消失了(把进程表的进程状态设置成FREE,就不会参与进程调度了)。
那么wait()是干什么的呢?如果你写过shell脚本的话,就很容易理解它的作用。我们执行一个程序之后,有时需要判断其返回值,这个返回值通常是通过$?得到。而你获取$?时,你执行的程序显然已经执行完毕(所以它才有返回值)。容易理解,这个返回值是我们执行的进程返回给shell的。换言之,是子进程返回给父进程的。父进程得到返回值的方法,就是执行一个wait()挂起,等子进程退出时,wait()调用方结束,并且父进程因此得到返回值。

exit()和wait()就是让子进程传递给父进程一个状态值使用的。子进程必须主动调用exit()生成返回值,父进程必须主动调用wait()获取子进程的返回值。为了完成这个功能,需要2个函数配合处理相应的逻辑。

do_exit/do_wait跟msg_send/msg_receive这两对函数是有点类似的,它们最终都是实现一次“握手”。

为配合exit()和wait(),进程又多了两种状态:WAITING和HANGING。如果一个进程X被置了HANGING位,那么X的所有资源都已被释放,只剩一个进程表项还占着。为什么要占着进程表项不释放呢?因为这个进程表项里面有个新成员:exit_status,它记录了X的返回值。只有当X的父进程通过调用wait( )取走了这个返回值,X的进程表项才被释放。
如果一个进程Y被置了WAITING位,意味着Y至少有一个子进程,并且正在等待某个子进程退出。
读者可能会想,如果一个子进程Z试图退出,但它的父进程却没有调用wait(),那Z的进程表项岂不一直占着得不到释放吗?事情的确如此,而且有个名称专门用来称呼像Z这样的进程,叫做“僵尸进程”(zombie)。如果一个进程Q有子进程,但它没有wait()就自己先exit()了,那么Q的子进程不会变成zombie,因为MM会把它们过继给Init,变成Init的子进程。也就是说,Init应该被设计成不停地调用wait( ),以便让Q的子进程们退出并释放进程表项。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值