天天看點

什麼僵屍程序

什麼是Linux的僵屍(zombie)程序

可能很少有人意識到,在一個程序調用了exit之後,該程序 并非馬上就消失掉,而是留下一個稱為僵屍程序(Zombie)的資料結構。在Linux程序的5種狀态中,僵屍程序是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行代碼,也不能被排程,僅僅在程序清單中保留一個位置,記載該程序的退出狀态等資訊供其他程序收集,除此之外,僵屍程序不再占有 任何記憶體空間。

僵屍程序的來由,要追溯到Unix,Unix的設計者們設計這個東西并非是因為閑來無事想裝裝酷什麼的。上面說到,僵屍程序中儲存着很多對程式員和系統管理者非常重要的資訊,首先,這個程序是怎麼死亡的?是正常退出呢,還是出現了錯誤,還是被其它程序強迫退出的?也就是說,這個程式的退出碼是什麼?其次,這個程序占用的總系統CPU時間和總使用者CPU時間分别是多少?發生頁錯誤的數目和收到信号的數目。這些資訊都被存儲在僵屍程序中,試想如果沒有僵屍程序,程序執行多長我們并不知道,一旦其退出,所有與之相關的資訊都立刻都從系統中清除,而如果此時父程序或系統管理者需要用到,就隻好幹瞪眼了。

是以,程序退出後,系統會把該程序的狀态變成Zombie,然後給上一定的時間等着父程序來收集其退出資訊,因為可能父程序正忙于别的事情來不及收集,是以,使用Zombie狀态表示程序退出了,正在等待父程序收集資訊中。

Zombie程序不可以用kill指令清楚,因為程序已退出,如果需要清除這樣的程序,那麼需要清除其父程序,或是等很長的時間後被核心清除。因為 Zombie的程序還占着個程序ID号呢,這樣的程序如果很多的話,不利于系統的程序排程。

下面,讓我們來看看一個示例:

01 /* zombie.c */

02 #include <sys/types.h>

03 #include <unistd.h>  main()

04 {

05     pid_t pid; 

06     pid=fork();

07     if(pid<0) { /* 如果出錯 */ 

08         printf(error occurred! );

09     }else if(pid==0){ /* 如果是子程序 */ 

10         exit(0);

11     }else{  /* 如果是父程序 */ 

12         sleep(60);  /* 休眠60秒 */ 

13         wait(NULL); /* 收集僵屍程序 */

14     }

15 }

編譯這個程式:

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調用。這兩者的作用都是收集僵屍程序留下的資訊,同時使這個程序徹底消失。轉自:http://www.linuxso.com/a/linuxxitongguanli/187.html

繼續閱讀