當我們使用 ps -ef 檢視程式時,發現 defunct,這就是所謂的殭屍程式,它是一個已死亡的程式,但在程式表(processs table)中仍佔了一個位置(slot)。由於程式表的容量是有限的,所以 defunct 程式不僅佔用系統的記憶體資源,影響系統的效能,而且如果其數目太多,還會導致系統癱瘓。
每個 Linux 的程式在程式表裡都有一個進入點(entry),核心程式執行該行程時所使用的一切資訊都儲存在進入點。當用 ps 命令察看系統中的程式資訊時,看到的就是程式表中的相關資料。而當使用 fork() 建立一個新的程式後,核心就會在程式表中給這個新行程分配一個進入點,然後將相關資訊儲存在該進入點所對應的程式表內,而這些資訊中有一項是父程式的識別碼。當這個程式結束後,它會執行 exit() 的系統呼叫,此時原來程式表中的資料會被該程式的退出碼(exit code)執行時所用的 CPU 時間等資料所取代,這些資料會一直保留到系統將它傳遞給它的父程式為止。
說了這麼多,defunct 的出現時間是在子程式終止後,但是父程式尚未讀取這些資料之前。簡單地說,子程式是由父程式產生的,但如果程式消失並且父程式未得到相關資料,就會出現 defunt 。