Linux 的殭屍 zombie 程序

2021-06-12 08:18:32 字數 1949 閱讀 3909

可能很少有人意識到,在乙個程序呼叫了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()

elseif(pid==0)else

}

編譯這個程式:

1.$ cc zombie.c -o zombie

後台執行程式,以使我們能夠執行下一條命令

1.$ ./zombie&

2.[1] 1217

列一下系統內的程序

1. $ps-ax

2. ... ...、

3. 1137 pts/0s 0:00 -bash

4. 1217   pts/0s   0:00   ./zombie

5. 1218   pts/0z   0:00   [zombie]

6. 1578   pts/0r   0:00ps-ax

其中的」z」就是殭屍程序的標誌,它表示1218號程序現在就是乙個殭屍程序。

收集zombie程序的資訊,並終結這些殭屍程序,需要我們在父程序中使用waitpid呼叫和wait呼叫。這兩者的作用都是收集殭屍程序留下的資訊,同時使這個程序徹底消失。

Linux 的殭屍 zombie 程序

可能很少有人意識到,在乙個程序呼叫了exit之後,該程序 並非馬上就消失掉,而是留下乙個稱為殭屍程序 zombie 的資料結構。在linux程序的5種狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行 也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等...

Linux 的殭屍 zombie 程序

可能很少有人意識到,在乙個程序呼叫了exit之後,該程序 並非馬上就消失掉,而是留下乙個稱為殭屍程序 zombie 的資料結構。在linux程序的5種狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行 也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等...

Linux 的殭屍 zombie 程序

可能很少有人意識到,在乙個程序呼叫了exit之後,該程序 並非馬上就消失掉,而是留下乙個稱為殭屍程序 zombie 的資料結構。在linux程序的5種狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行 也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等...