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