僵死进程是什么
僵死进程:子进程先于父进程结束,父进程没有调用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. 父进程没有获取子进程的状态码