殭屍程序的產生與解決方法

2021-03-17 08:52:45 字數 1418 閱讀 4407

產生原因:

在unix 系統中,乙個程序結束了,但是他的父程序沒有等待(呼叫wait / waitpid)他,那麼他將變成乙個殭屍程序。通過ps命令檢視其帶有defunct的標誌。殭屍程序是乙個早已死亡的程序,但在程序表(processs table)中仍佔了乙個位置(slot)。

但是如果該程序的父程序已經先結束了,那麼該程序就不會變成殭屍程序。因為每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序,看看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由init程序來接管他,成為他的父程序,從而保證每個程序都會有乙個父程序。而init程序會自動wait其子程序,因此被init接管的所有程序都不會變成殭屍程序。

原理分析:

每個unix程序在程序表裡都有乙個進入點(entry),核心程序執行該程序時使用到的一切資訊都儲存在進入點。當用 ps 命令察看系統中的程序資訊時,看到的就是程序表中的相關資料。當以fork()系統呼叫建立乙個新的程序後,核心程序就會在程序表中給這個新程序分配乙個進入點,然後將相關資訊儲存在該進入點所對應的程序表內。

這些資訊中有一項是其父程序的識別碼。

子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法**子程序到底什麼時候結束。那麼會不會因為父程序太忙來不及 wait 子程序,或者說不知道子程序什麼時候結束,而丟失子程序結束時的狀態資訊呢?不會。

因為unix提供了一種機制可以保證,只要父程序想知道子程序結束時的狀態資訊,就可以得到。這種機制就是:當子程序走完了自己的生命週期後,它會執行exit()系統呼叫,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等。

但是仍然為其保留一定的資訊(包括程序號the process id,退出碼exit code,退出狀態the terminationstatus of the process,執行時間the amount of cpu time taken by the process等),這些資料會一直保留到系統將它傳遞給它的父程序為止,直到父程序通過wait / waitpid來取時才釋放。

解決方法:

(1) 父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起。

執行wait()或waitpid()系統呼叫,則子程序在終止後會立即把它在程序表中的資料返回給父程序,此時系統會立即刪除該進入點。在這種情形下就不會產生defunct程序。

(2) 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler。在子程序結束後,父程序會收到該訊號,可以在handler中呼叫wait**。

(3) 如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigcld, sig_ign)通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**,並不再給父程序傳送訊號

(4)fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork乙個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的**還要自己做。

電梯門雜訊產生原因及解決方法

對於安全的電梯,使用者首先感覺到的是電梯門執行和電梯的整體執行,高質量的門執行能明顯地告訴電梯使用者我們的電梯是安全的,因此電梯門執行的質量,能充分體現電梯廠家的安裝 維護的技術力量和技術水平,提高門執行質量 去除門執行雜訊是安裝 維修工作中重要的一項工作。在此對電梯門執行雜訊產生的原因及解決的方法...

離心幫浦產生振動的原因及解決方法

3.出口管道存有氣囊 在開幫浦時即使有空氣排放比較徹底,也很難放淨,執行時容易形成氣囊,使管道壓力產生波動。解決的方法是將排空點盡量安裝在高處,並注意對個別區域性的排氣處理。此外,在操作中,開幫浦時先用小排量打水,使幹線壓力緩慢上公升,也可使壓力波動減小。五 維修中注意的問題 在維修過程中,應嚴格按...

問題分析與解決方法

一 問題的定義 矛盾即現實與目標之間的差距。二 目的 消除問題的根本原因,預防問題重 生,減少浪費使團隊工作更加有效。三 各個步驟的結構 1 關鍵活動 闡明每個步驟需要採取的行動。2 檢查問題 通過問 如何 使你檢查到你每一步已集中注意了最關鍵的內容。通過問 如何 使你能夠檢查你在每一步已集中注意了...