如何處理Linux中的殭屍程序defunct

2021-09-11 07:00:46 字數 2238 閱讀 9049

我們知道,每個unix程序在程序表裡都有乙個進入點(entry),核心程式執行該程序時使用到的一切資訊都儲存在進入點。當用ps命令察看系統中的程序資訊時,看到的就是程序表中的相關資料。當以fork()系統呼叫建立乙個新的程序後,核心程序就會在程序表中給這個新程序分配乙個進入點,然後將相關資訊儲存在該進入點所對應的程序表內。這些資訊中有一項是其父程序的識別碼。當這個程序走完了自己的生命週期後,它會執行exit()系統呼叫,此時原來程序表中的資料會被該程序的退出碼(exit code)、執行時所用的cpu時間等資料所取代,這些資料會一直保留到系統將它傳遞給它的父程序為止。由此可見,defunct程序的出現時間是在子程序終止後,但是父程序尚未讀取這些資料之前。defunct程序是不能直接kill -9殺掉的,否則就不叫殭屍程序了。

乙個程序在呼叫exit()命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序(zombie)的資料結構(系統呼叫exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀)。在linux程序的狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所有記憶體空間,沒有任何可執行**,也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等資訊供其他程序收集,除此之外,殭屍程序不再占有任何記憶體空間。它需要它的父程序來為它收屍,如果他的父程序沒安裝sigchld訊號處理函式呼叫wait或waitpid()等待子程序結束,又沒有顯式忽略該訊號,那麼它就一直保持殭屍狀態,如果這時父程序結束了,那麼init程序自動會接手這個子程序,為它收屍,它還是能被清除的。但是如果如果父程序是乙個迴圈,不會結束,那麼子程序就會一直保持殭屍狀態,這就是為什麼系統中有時會有很多的殭屍程序。

#include#include#include#includeint main(int argc, char *ar**)

else if(pid==0)

else

return exit_success;

}

父程序建立子程序後30s呼叫wait()函式,等待子程序退出,**子程序的資源,這也意味著子程序將會成為殭屍程序30s-5s=25s。 

上述方法比較簡潔,但是有個問題就是子程序如果處理的時間比較長的話,主程序會被掛起。比如: 

socket()

bind()

listen()

while(1)

close()

exit

}wait() //如果這裡父程序進行wait()操作,則很有可能再此處掛起,而如果不進行wait()操作,則此處又產生了殭屍程序。

}

對於這樣的情況可以採取連續fork()兩次的方法。簡而言之,首先父程序首先建立子程序,子程序建立孫子程序,由孫子程序處理事務,而子程序再建立完孫子程序後,就退出。此時,孫子程序的父程序,也就是子程序退出了,因此孫子程序變為了乙個孤兒程序,linux程序處理孤兒的程序的方式,是init程序接管孤兒程序,而init程序的子程序不會成為殭屍程序。所以上述的偽**可以寫為:

pid_t pid;

pid = fork();

if(pid<1)

else if(pid==0 )

else

}else

//《爺爺程序進入下一輪的處理。

}

#include     

#include

#include

#include

#include

#include

int num_clients = 0;

int dead_clients = 0;

void sig_chld_handler(int sig)

}

int main(int argc, char **ar**) else if (pid > 0)

}

sleep(10);

return 0;

}

父程序首先註冊乙個訊號處理函式signal(sigchld, sig_chld_handler),然後每當子程序退出的時候父程序都會受到sigchld訊號,觸發sig_chld_handler()函式,呼叫wait()函式等待子程序的退出。

挖礦程序如何處理

說明 挖礦程式一般有主程序和守護程序組成,有些還會通過crontab來啟動定時任務 排查過程 進入挖礦主程序的proc檔案下檢視程序基本資訊,可檢視到程序的執行路徑 cwd檔案 可執行程式所在的路徑 exe fd資料夾下會有網路相關的資訊,一般如此即可發現很多資訊 檢視crontab有無異常情況 檢...

Linux下殭屍程序的處理

category 工作學習 linux 2010.12.31 什麼是殭屍程序 殭屍程序是指它的父程序已經退出 父程序沒有等待 呼叫wait waitpid 它 而該程序dead之後沒有程序接受,就成為殭屍程序,也就是 zombie 程序。殭屍程序是怎麼樣產生 乙個程序在呼叫exit命令結束自己的生命...

Linux的殭屍程序處理1

linux中有兩種異常的程序 1.孤兒程序 應用通過fork程序後,父程序被kill或者exit,該父程序的子程序被1號程序接管。linux核心啟動時候回啟動0號程序,啟動完畢後0號程序就處於空閒狀態,所有的程序的父程序都是有1號程序fork出來的。2.殭屍程序 fork操作出來的父子程序,子程序收...