僵死程序
在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait()或者waitpid()系統呼叫取得子程序的終止狀態。如果父程序沒有這麼做的話,子程序雖然已經退出了,但是在系統程序表中還為它保留了一些退出狀態的資訊,如果父程序一直不取得這些退出資訊的話,這些程序表項就將一直被占用,此時,這些子程序就成為「僵死程序」(zombie)。系統程序表是一項有限資源,如果系統程序表被僵死程序耗盡的話,系統就可能無法建立新的程序。
孤兒程序
孤兒程序是指這樣一類程序:在程序還未退出之前,它的父程序就已經退出了,乙個沒有了父程序的子程序就是乙個孤兒程序(orphan)。既然所有程序都必須在退出之後被wait()或waitpid()以釋放其遺留在系統中的一些資源,那麼應該由誰來處理孤兒程序的善後事宜呢?這個重任就落到了init程序身上,每當出現乙個孤兒程序的時候,核心就把孤兒程序的父程序設定為init,而init程序會迴圈地wait()它的已經退出的子程序。這樣,當乙個孤兒程序結束了其生命週期的時候,init程序就會出面處理它的一切善後工作。
怎樣產生殭屍程序的:
乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序(zombie)的資料結構(系統呼叫exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀)。
在linux程序的狀態中,殭屍程序
是非常特殊的一種,它已經放棄了幾乎所有記憶體空間,沒有任何可執行**,也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退
出狀態等資訊供其他程序收集,除此之外,殭屍程序不再占有任何記憶體空間。
它需要它的父程序來為它收屍,如果他的父程序沒安裝sigchld信
號處理函式呼叫wait或waitpid()等待子程序結束,又沒有顯式忽略該訊號,那麼它就一直保持殭屍狀態,如果這時父程序結束了,那麼init程序自動
會接手這個子程序,為它收屍,它還是能被清除的。但是如果父程序是乙個迴圈,不會結束,那麼子程序就會一直保持殭屍狀態,這就是為什麼系統中有時會有很多的殭屍程序。
linux系統對執行的程序數量有限制,如果產生過多的殭屍程序占用了可用的程序號,將會導致新的程序無法生成。這就是殭屍程序對系統的最大危害。
怎樣來清除殭屍程序:
1.改寫父程序,在子程序死後要為它收屍。具體做法是接管sigchld訊號。子程序死後,會傳送sigchld訊號給父程序,父程序收到此訊號後,執行 waitpid()函式為子程序收屍。這是基於這樣的原理:就算父程序沒有呼叫wait,核心也會向它傳送sigchld訊息,儘管對的預設處理是忽略,如果想響應這個訊息,可以設定乙個處理函式。
2.把父程序殺掉。父程序死後,殭屍程序成為"孤兒程序",過繼給1號程序init,init始終會負責清理殭屍程序.它產生的所有殭屍程序也跟著消失。
Linux 殭屍程序
怎樣產生殭屍程序的 乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序 zombie 的資料結構 系統呼叫 exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀 在linux程序的狀態中,殭屍程序是非常特殊的...
linux殭屍程序
殭屍程序是指子程序退出時,父程序並未對其發出的sigchild訊號進行適當處理,導致子程序停留在殭屍狀態等待其父程序為其收屍,這個狀態下的子程序就是殭屍程序。include include include int main int argc,char argv return 0 從上面的執行結果可以...
linux 殭屍程序
關於zombie程序 這些程序已經死亡,但沒有釋放系統資源,包括記憶體和一些一些系統表等,如果這樣的程序很多,會引發系統問題。用ps el看出的程序狀態如果是z,就是殭屍程序。ps ef grep defunc可以找出殭屍程序.有些zombie程序時用kill 9也不能殺死,而且消耗了很多系統資源不...