僵死进程 【Linux从基础到进阶】

僵死进程是什么

僵死进程:子进程先于父进程结束,父进程没有调用wait获取子进程退出码

当一个进程结束时,进程实体先被释放,因为PCB中的exit_code记录进程的退出码,只有当进程的退出码被父进程获取之后,进程的PCB才会被释放。
在这里插入图片描述
而在父进程获取它的退出码之前,它就叫僵死进程

让我们观察一下下面的代码

在代码中,我没有处理这个僵死进程
在这里插入图片描述
在这里插入图片描述
在后台运行这个程序,并使用ps 观察
在这里插入图片描述
此时就出现了僵死进程
在这里插入图片描述
那我们这样没有处理子进程这个僵死进程会不会对系统有影响?会不会它一直就在那里,无法释放。

答案: 不会,因为在父进程结束后,子进程会被init 1号进程收养,由init 1 号进程来处理这个僵死进程,而init1号进程一定会获取该进程的退出码的。

使用信号量处理僵死进程

那我们有办法处理这个僵死进程吗?

有,我们可以通过wait方法来处理僵死进程,不过如果直接在父进程里面调用wait方法的话,那么父进程就会一直阻塞,直到子进程结束,然后掉用wait方法,继续执行。

因此,我们可以利用信号量来帮助我们。

请看代码

在这里插入图片描述

在这里插入图片描述

WEXITSTATUS()的实质

WEXITSTATUS()的实质
在这里插入图片描述
运行删除WEXITSTATUS()前的程序,我们发现退出码为3
在这里插入图片描述
运行删除了WEXITSTATUS()前的程序,我们发现退出码为768
在这里插入图片描述
那为什么会这样呐?

让我们使用计算器来做进制转换,我们发现768 的二进程为
0011 0000 0000
当我们去除后8位,我们发现它的值为3
在这里插入图片描述
当我们把这里改成右移8位时
在这里插入图片描述
当我们再运行程序,我们发现退出码变为了3
**加粗样式**
此时我们明白,WEXITSTATUS()这个函数的实质就是把一个变量右移8位

总结:

要想成为僵死进程

1. 子进程先结束

      假如说父进程先结束,那么子进程一定不会成为僵死进程,因为父进程先
      结束后,子进程会被init进程收养,而init进程一定会获取它的退出码。

2. 父进程没有获取子进程的状态码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值