OP1
Q: 什么是孤儿进程(orphan process),什么是僵尸进程(zombie process)?
** A:** 孤儿进程指的是父进程退出后仍在运行的子进程,可能不止一个。僵尸进程指的是已经运行结束(即已经向父进程报告exit状态),但由于某种原因,进程描述符(PID)仍然处于进程列表中,PID无法被回收重用的进程。
OP2
Q: Linux是如何应对孤儿进程和僵尸进程的?管理员需要如何处理这两种进程?
** A:** 孤儿进程一旦出现,kernel的init进程就会成为它们的父进程,init会轮询每个进程的状态,并完成资源清理等善后工作。由于kernel会很好地处理孤儿进程,而且即便管理员强行杀死某个已经被init收养了的孤儿进程,init也会完成善后工作,所以,在不考虑程序本身逻辑的层面上,孤儿进程不存在需要管理员出面解决的危害。
而僵尸进程的存在会使得一个PID无法被复用,当PID超过上限(通常是32767,这个值可以更改)时,系统将无法为新进程分配PID,这就导致无法创建新进程。而且大量僵尸进程会填满你的进程列表,让你无法进行正常的管理。每一个进程在结束(发送exit状态)后,不会马上消失,而是都会处于僵尸状态,等待父进程进行资源清理和信息收集。出现僵尸进程堆积的根本原因是,父进程没有在收到exit后及时对子进程进行处理。所以,想终结僵尸进程,只需要杀死父进程,使得子进程成为孤儿进程,就可以由init进程进行善后。
在编程时,通常通过waitpid来处理子进程的SIGCHILD信号,也可以对子进程进行两次fork,这样,在第一层子进程结束后,第二层子进程就会成为孤儿进程,可以由init进行善后工作。