什么是孤儿进程和僵死进程?

一、前言

本文先介绍unix系统中进程的退出以及终止过程,然后介绍什么是孤儿进程以及僵死进程。包含如下内容:
1.进程终止过程
2.孤儿进程
3.僵死进程

二、进程终止的过程

2.1 进程的终止状态

进程终止分为正常终止和异常终止。
正常终止包括如下5种情况:

1.在main函数中调用return
2.调用exit函数
3.调用_exit或_Exi函数
4.进程的最后一个线程在其启动例程中调用return
5.进程的最后一个线程调用thread_exit函数

异常终止的3种情况:

1.调用abort
2.进程接收到某些信号
3.最后一个线程对取消请求做出响应。

ps:无论进程如何终止,最终都会执行内核中的同一段代码,这段代码为相应进程关闭所有打开的文件描述符,释放其所使用的存储器等。

2.2 父进程如何获取子进程的终止状态

无论是哪种终止情况,我们都希望父进程能够获取到子进程的终止状态。对于正常的退出,比如调用exit类函数,内核会将其退出状态转换为终止状态。如果是异常退出,内核会产生一个异常终止的状态。无论是哪种情况,终止进程的父进程都能通过wait或者waitpid获取子进程的终止状态。

三、孤儿进程

一个进程调用了fork创建了子进程后,当子进程退出时,父进程能够通过wait或waitpid获取子进程的退出状态。但是,如果一个进程在其子进程结束前终止了,子进程失去了父进程就成为了孤儿进程。
当一个父进程终止时,内核会检查所有活动的进程,判断这些进程是否是将要终止进程的子进程,如果是的话,会将这些子进程的父进程设为init进程,确保每一个子进程都有父进程。

四、僵死进程

所谓的僵死进程,指的是一个子进程已经终止了,但父进程还未释放子进程相关资源,那么该子进程就是僵死进程。
简单来说,就是已经终止了,但是资源还未释放完全的进程。
出现僵死进程是有原因的:当一个进程终止时,我们希望父进程还是能够获取到子进程的终止状态,因此,即使子进程已经终止了,还是会保留一小块内存去存储子进程的终止状态等信息,直到父进程通过wait或者waitpid获取这些信息后才会完全释放。
init进程的子进程终止后是不会成为僵死进程的,因为init进程被设计成只要有子进程终止,就会调用wait获取其终止状态。

参考资料:

《UNIX环境高级编程(第3版) (史蒂文斯 (W.Richard Stevens) 拉戈 (StephenA.Rago))(Z-Library)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值