僵尸進程(Zombie Process)是指一個子進程已經結束運行,但由于父進程沒有調用 wait() 或 waitpid() 系統調用來回收子進程的資源,導致子進程的進程描述符仍然保存在系統中,從而形成的“僵尸”狀態。
SIGCHLD 信號,通知父進程其退出狀態。如果父進程沒有調用 wait() 或 waitpid() 來讀取子進程的退出狀態并回收資源,子進程就會成為僵尸進程。init 進程(進程號為 1)接管,init 進程可以清理這些孤兒進程產生的僵尸進程。可以使用以下命令來查看系統中的僵尸進程:
ps -ef | grep defunct:查找狀態為 Z 的進程。ps -A -o stat,ppid,pid,cmd | grep -e '[Zz]':通過 grep 抓取狀態為 Z 或 z 的進程。init 進程會負責清理其子進程產生的僵尸進程。ps -A -o stat,ppid,pid,cmd | grep -e '[Zz]' | awk '{print 2}' | xargs kill -9
wait() 或 waitpid() 系統調用:父進程可以在適當的時候調用 wait() 或 waitpid(),等待子進程的終止,并獲取子進程的終止狀態,從而清除僵尸進程。SIGCHLD 信號捕捉:父進程可以使用 signal() 函數注冊 SIGCHLD 信號的處理函數,在子進程終止時通過信號處理函數調用 wait() 或 waitpid() 處理子進程的終止狀態。SIGCHLD 信號:父進程可以使用 signal() 函數將 SIGCHLD 信號的處理函數設置為 SIG_IGN,表示忽略該信號。這樣,在子進程終止后,內核會自動回收子進程的資源,不會產生僵尸進程。