可能很少有人意識到,在乙個程序呼叫了exit之後,該程序 並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構。在linux程序的5種狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行**,也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等資訊供其他程序收集,除此之外,殭屍程序不再占有 任何記憶體空間。
殭屍程序的來由,要追溯到unix,unix的設計者們設計這個東西並非是因為閒來無事想裝裝酷什麼的。上面說到,殭屍程序中儲存著很多對程式設計師和系統管理員非常重要的資訊,首先,這個程序是怎麼死亡的?是正常退出呢,還是出現了錯誤,還是被其它程序強迫退出的?也就是說,這個程式的退出碼是什麼?其次,這個程序占用的總系統cpu時間和總使用者cpu時間分別是多少?發生頁錯誤的數目和收到訊號的數目。這些資訊都被儲存在殭屍程序中,試想如果沒有殭屍程序,程序執行多長我們並不知道,一旦其退出,所有與之相關的資訊都立刻都從系統中清除,而如果此時父程序或系統管理員需要用到,就只好乾瞪眼了。
所以,程序退出後,系統會把該程序的狀態變成zombie,然後給上一定的時間等著父程序來收集其退出資訊,因為可能父程序正忙於別的事情來不及收集,所以,使用zombie狀態表示程序退出了,正在等待父程序收集資訊中。
zombie程序不可以用kill命令清楚,因為程序已退出,如果需要清除這樣的程序,那麼需要清除其父程序,或是等很長的時間後被核心清除。因為zombie的程序還佔著個程序id號呢,這樣的程序如果很多的話,不利於系統的程序排程。
下面,讓我們來看看乙個示例:
/* zombie.c */
#include #include main()
else if(pid==0)else
}
編譯這個程式:
$ cc zombie.c -o zombie
後台執行程式,以使我們能夠執行下一條命令
$ ./zombie &
[1] 1217
列一下系統內的程序
$ ps -ax
... ...
1137 pts/0 s 0:00 -bash
1217 pts/0 s 0:00 ./zombie
1218 pts/0 z 0:00 [zombie]
1578 pts/0 r 0:00 ps -ax
其中的」z」就是殭屍程序的標誌,它表示1218號程序現在就是乙個殭屍程序。
收集zombie程序的資訊,並終結這些殭屍程序,需要我們在父程序中使用waitpid呼叫和wait呼叫。這兩者的作用都是收集殭屍程序留下的資訊,同時使這個程序徹底消失。
via
Linux 的殭屍 zombie 程序
可能很少有人意識到,在乙個程序呼叫了exit之後,該程序 並非馬上就消失掉,而是留下乙個稱為殭屍程序 zombie 的資料結構。在linux程序的5種狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行 也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等...
Linux 的殭屍 zombie 程序
可能很少有人意識到,在乙個程序呼叫了exit之後,該程序 並非馬上就消失掉,而是留下乙個稱為殭屍程序 zombie 的資料結構。在linux程序的5種狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行 也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等...
Linux 的殭屍 zombie 程序
可能很少有人意識到,在乙個程序呼叫了exit之後,該程序 並非馬上就消失掉,而是留下乙個稱為殭屍程序 zombie 的資料結構。在linux程序的5種狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行 也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等...