當乙個子程序結束後,他的父程序沒有等待他(wait waitpid)清除他的所有資源時,它就變成乙個殭屍程序。
在linux系統中,在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等。但是仍然為其保留一定的資訊(包括程序號the process id,退出狀態the termination status of the process,執行時間the amount of cpu time taken by the process等)。直到父程序通過wait / waitpid來取時才釋放. 但這樣就導致了問題,如果程序不呼叫wait / waitpid的話,那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。
那麼可以通過殺掉他的父程序來把殭屍程序一起殺掉。
ps -aux 其中的ppid 就是乙個殭屍程序的父程序
殭屍程序產生
linux程序退出並不代表被刪除
在linux環境下,當某個程序退出時並不代表該程序在系統中已經被刪除,還有一些包含程序狀態等資料儲存在系統中,若不人為進行刪除,則會一直囤積在系統中,久而久之就會產生大量剩餘資料。
殭屍程序基本概念
linux系統中,出了init程序,其他所有程序都是通過parent進行fork出來的,我們成為child程序,當child程序退出後,核心中包含child程序的資料沒有被刪除,這種情況就是殭屍程序。一般情況下,每個程序在退出之後,都會傳送乙個sigchld訊號給它的parent程序,預設情況下,parent程序是不處理該訊號事件。
殭屍程序產生的條件
當child程序退出時候,系統會傳送乙個sigchld訊號給它對應的parent程序,parent進行若不處理該訊號,則會產生殭屍程序現象,若通過呼叫wait() 或者waitpid()函式則會處理該事件,就不會產生殭屍程序。
對於child程序和parent程序來說,有兩種情景,就是誰先退出,若parent程序先退出,則child程序會被託付給init程序,init程序則有對sigchld訊號的處理,不會產生殭屍程序;若child程序先退出,parent程序一直沒有退出,也沒有執行對sigchld訊號處理操作,則會產生殭屍程序。
殭屍程序產生例項
我們利用ps命令可以檢視殭屍程序,一般具有標誌:
[cpp]view plain
copy
#include
#include
intmain()
exit(0);
}
上面例項中,由於parent程序一直處於執行狀態,child程序退出時候,parent並沒有呼叫wait() 或者waitpid() 函式操作,就會產生殭屍程序。
執行該應用後,執行ps命令:
[plain]view plain
copy
qq@qq-aspire-tc-606:~/qqzhong/tmp/c$ ps auxw|grep zombie
qq 4100 0.0 0.0 4196 356 pts/1 s+ 16:41 0:00 ./zombie_tmp
qq 4101 0.0 0.0 0 0 pts/1 z+ 16:41 0:00 [zombie_tmp]
如何避免殭屍程序
fork 和 wait 成對出現
上面我們可以看到,產生殭屍程序的條件,為了避免產生殭屍程序,必須是吸納fork 和 wait成對出現,wait在fork之後進行呼叫。
避免產生殭屍程序例項
根據上面的例項,我們增加處理操作,**如下:
[cpp]view plain
copy
#include
#include
intmain()
exit(0);
}
執行該應用,通過ps命令檢視後如下
[plain]view plain
copy
qq@qq-aspire-tc-606:~/qqzhong/tmp/c$ ps auxw|grep zombie
qq 4147 0.0 0.0 4196 356 pts/1 s+ 16:45 0:00 ./zombie_tmp
linux殭屍程序分析
linux的殭屍程序及其解決方法 1.產生原因 在unix 系統中,乙個程序結束了,但是他的父程序沒有等待 呼叫wait waitpid 他,那麼他將變成乙個殭屍程序。通過ps命令檢視其帶有defunct的標誌。殭屍程序是乙個早已死亡的程序,但在程序表 processs table 中仍佔了乙個位置...
Linux殭屍程序分析清除
步驟一 top 命令分析檢視 如圖所示,zombie 殭屍程序 數量1.步驟二 ps 檢視殭屍程序的具體資訊 ps e o stat,ppid,pid,cmd egrep zz 顯示出 程序id ps ps命令用於獲取當前系統的程序資訊.e 引數用於列出所有的程序 o 引數用於設定輸出格式,這裡只輸...
殭屍程序的查詢及殭屍程序的kill
首先我們來看看什麼是殭屍程序 之前的學習過程中時這樣理解殭屍程序的 子程序先於父程序退出,並將退出原因保留在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序子程序退出了,你去獲取一下原因,再完全釋放子程序資源。若父程序不管子程序的退出狀態,則該子程序為了儲存退出原因而將進入...