我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸状态是一个比较特殊的状态,当进程退出父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会在以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
僵尸进程与孤儿进程的区别:
孤儿进程是子进程还在运行,而父进程挂了,子进程被init进程收养。僵尸进程是父进程还在运行但是子进程挂了,但是父进程却没有使用wait来清理子进程的进程信息,导致子进程虽然运行实体已经消失,但是仍然在内核的进程表中占据一条记录,这样长期下去对于系统资源是一个浪费。僵尸进程将会导致资源浪费,而孤儿则不会。
那么如何避免僵尸进程呢
(1)fork两次
原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程
(2)通过信号机制
子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程
————————————————
版权声明:本文为CSDN博主「Cynthia_wpp」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41050155/article/details/81945208
相关文章
- 08-28进程中的信号赋值与变量赋值
- 08-28用信号量进程同步与互斥
- 08-28进程与线程 - 入门知识篇
- 08-28进程同步与互斥——理发师问题(实现OS上的伪代码)
- 08-28进程同步与互斥习题
- 08-28进程与线程的区别
- 08-28进程与线程
- 08-28python 并发编程 查看进程的pid与ppid
- 08-28swoole2——Worker与TaskWorker进程
- 08-28Python子进程:与Shell脚本进行交互