模拟实现僵尸进程和孤儿进程

僵尸进程和孤儿进程的概念

僵尸进程:一个子进程在其父进程没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。
进程在终止时,系统会回收所有内核分配给它的内存、关闭它打开的所有文件等等,但还会保留一些极少的信息,因为进程终止后有些信息对于父进程和内核还是很有用的,例如进程的ID号、进程的退出状态、进程运行的CPU时间等。父进程可以使用 wait/waitpid 等系统调用来获得这些信息,并为子进程做一些收尾工作。
但如果父进程一直不调用wait / waitpid的话, 么子进程保留的那段信息就不会释放,其进程号就会一直被占用,这样子进程就会成为“占着茅坑不拉屎”的僵尸进程,除非等到其父进程退出后该进程将被init(进程号为1)回收。
其实任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。  如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。
由于系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程,这种危害还是蛮大的。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。
每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init来接管他,成为他的父进程。故孤儿进程的状态收集工作由init进程负责。

模拟实现僵尸进程

首先编写一个僵尸进程,由于我们无法得知是子进程先退出还是父进程先退出,所以使父进程休眠30s,以保证子进程先退出。

使程序运行起来,然后打开另外一个终端,查看进程状态

可以看出此时系统中多了一个状态为‘Z+’,进程号为4117的僵尸进程,我们用kill来杀掉这个进程,却发现4117进程仍然存在,此时我们就能明白为什么称之为僵尸进程了。等到30s后,父进程退出了,这个僵尸进程也就被init收尸了。

模拟实现孤儿进程

编写一个孤儿进程,保证父进程比子进程先退出,两次输出子进程的pid和ppid,观察有何不同

可以看出子进程的ppid一开始为4265,等到父进程退出后,子进程被init进程领养,ppid变为1。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值