僵尸進程是在Linux系統中一種特殊狀態的進程,指一個子進程結束運行后,其父進程沒有及時回收其資源,導致子進程的信息仍然保留在進程表中。
子進程結束而父進程未回收資源:
當一個子進程完成其任務并調用 exit()
系統調用時,它會向操作系統報告自己的退出狀態。如果父進程沒有調用 wait()
或 waitpid()
等系統調用來獲取子進程的退出狀態,該子進程就會變成僵尸進程。
父進程未處理SIGCHLD信號:
子進程退出時會發送一個 SIGCHLD
信號給父進程,通知父進程它已經結束。如果父進程沒有處理這個信號或者沒有調用 wait()
系列函數來清理子進程的狀態,子進程就會變成僵尸進程。
ps aux
查看僵尸進程。雖然僵尸進程本身不占用資源,但它們仍然占用進程表中的一個條目,并且保留了一些退出狀態信息。如果系統中出現大量僵尸進程,可能會導致可用進程號耗盡,從而使新進程無法創建,進而影響系統性能和穩定性。
wait()
或 waitpid()
函數來回收子進程的狀態信息。SIGCHLD
信號,當子進程退出時,這個信號處理函數會被調用,然后可以安全地調用 wait()
或 waitpid()
來清理子進程。ps
命令結合 grep
來查找僵尸進程,然后通過殺死父進程來間接清理僵尸進程。通過合理的管理和清理僵尸進程,可以保持系統的健康和高效運行。