1,、基本概念
孤儿进程:父进程先于子进程结束,此时子进程就成为孤儿进程,有init领养
僵尸进程:子进程先于父进程结束,而父进程没有调用wait(waitpid)函数来等待子进程结束,此时子进程成为僵死进程。
ps:僵尸进程仍然是系统能够感知的进程,所以会暂用一定的系统资源,如果很多这样的进程堆积会影响系统的性能。
2、僵尸进程的产生
父进程先于子进程退出前没有调用wait(waitpid)函数,或者对SIGCHILD信号没做处理,这种情况如果父进程一直到退出都没有调用wait函数,那么僵尸进程就会被视为孤儿进程被init领养。(init进程处理的方式是只要自己有一个子进程结束就调用wait或者waitpid函数)
父进程过于忙碌(比如服务器进程需要一直运行)。
3、僵尸进程的避免
对于以上说的两次产生僵尸进程的情况:
可以通过调用wait或者waitpid函数避免僵尸进程。
对于第二种情况,父进程要一直运行,可以采用“两次fork”的方式来避免僵尸进程
两次fork的原理:进程A调用fork产生子进程B,然后调用wait或者waitpid等待子进程B的结束,进程B调用fork产生子进程C,使B在C结束之前结束,此时C编程孤儿进程由init领养,这样A和C就没有了继承关系,互不干扰,各施其责。
示例代码: