OP1
Q: 什么是孤兒進(jìn)程(orphan process)挂捅,什么是僵尸進(jìn)程(zombie process)?
** A:** 孤兒進(jìn)程指的是父進(jìn)程退出后仍在運(yùn)行的子進(jìn)程莉给,可能不止一個(gè)吗垮。僵尸進(jìn)程指的是已經(jīng)運(yùn)行結(jié)束(即已經(jīng)向父進(jìn)程報(bào)告exit狀態(tài)),但由于某種原因残腌,進(jìn)程描述符(PID)仍然處于進(jìn)程列表中,PID無法被回收重用的進(jìn)程贫导。
OP2
Q: Linux是如何應(yīng)對孤兒進(jìn)程和僵尸進(jìn)程的抛猫?管理員需要如何處理這兩種進(jìn)程?
** A:** 孤兒進(jìn)程一旦出現(xiàn)孩灯,kernel的init進(jìn)程就會(huì)成為它們的父進(jìn)程闺金,init會(huì)輪詢每個(gè)進(jìn)程的狀態(tài),并完成資源清理等善后工作钱反。由于kernel會(huì)很好地處理孤兒進(jìn)程,而且即便管理員強(qiáng)行殺死某個(gè)已經(jīng)被init收養(yǎng)了的孤兒進(jìn)程匣距,init也會(huì)完成善后工作面哥,所以,在不考慮程序本身邏輯的層面上毅待,孤兒進(jìn)程不存在需要管理員出面解決的危害尚卫。
而僵尸進(jìn)程的存在會(huì)使得一個(gè)PID無法被復(fù)用,當(dāng)PID超過上限(通常是32767尸红,這個(gè)值可以更改)時(shí)吱涉,系統(tǒng)將無法為新進(jìn)程分配PID,這就導(dǎo)致無法創(chuàng)建新進(jìn)程外里。而且大量僵尸進(jìn)程會(huì)填滿你的進(jìn)程列表怎爵,讓你無法進(jìn)行正常的管理。每一個(gè)進(jìn)程在結(jié)束(發(fā)送exit狀態(tài))后盅蝗,不會(huì)馬上消失鳖链,而是都會(huì)處于僵尸狀態(tài),等待父進(jìn)程進(jìn)行資源清理和信息收集墩莫。出現(xiàn)僵尸進(jìn)程堆積的根本原因是芙委,父進(jìn)程沒有在收到exit后及時(shí)對子進(jìn)程進(jìn)行處理逞敷。所以,想終結(jié)僵尸進(jìn)程灌侣,只需要?dú)⑺栏高M(jìn)程推捐,使得子進(jìn)程成為孤兒進(jìn)程,就可以由init進(jìn)程進(jìn)行善后侧啼。
在編程時(shí)牛柒,通常通過waitpid來處理子進(jìn)程的SIGCHILD信號,也可以對子進(jìn)程進(jìn)行兩次fork慨菱,這樣焰络,在第一層子進(jìn)程結(jié)束后,第二層子進(jìn)程就會(huì)成為孤兒進(jìn)程符喝,可以由init進(jìn)行善后工作闪彼。