一、什麼是殭屍進程?
子進程結束後,內核會向父進程發送SIGCHLD信號。若父進程沒有顯式忽略該信號或調用相應的信號處理函數(調用wait, waitpid等函數)回收殭屍進程,則該子進程將保持爲zombie狀態。
一個子進程已經終止,但其父進程尚未對其進行處理,這樣的子進程稱爲殭屍進程(zombie)
殭屍進程已釋放內存空間,不能被調度,僅僅是在進程列表中保留一個記錄,它記錄着子進程是如何結束的,退出狀態等信息。
父進程結束後,init進程(進程ID 爲1)將會接管子進程,它負責子進程的回收工作。
二、查看殭屍進程
[root@myhost ~]# ps -aux|grep defunct
root 4324 0.0 0.0 0 0 pts/0 Z+ 09:39 0:00 [myzombie] <defunct>
root 4747 0.0 0.1 3912 684 pts/2 S+ 09:54 0:00 grep defunct
其狀態爲”Z+”
三、消除殭屍進程
用kill 命令並不能殺死殭屍進程
1. 顯式忽略SIGCHLD信號
signal(SIGCHLD, SIG_IGN); // 顯式忽略信號
2. 調用wait, waitpid函數
3. fork兩次
4. 殺死父進程