Linux之殭屍程序

2022-06-11 19:48:10 字數 1357 閱讀 4971

殭屍程序是當子程序比父程序先結束,而父程序又沒有**子程序,釋放子程序占用的資源,此時子程序將成為乙個殭屍程序。如果父程序先退出 ,子程序將會被被init程序(init是系統程序,pid為1)接管(此時該子程序稱為孤兒程序),子程序退出後init程序會**其占用的相關資源。

在unix 系統中,乙個程序結束了,但是他的父程序沒有等待(呼叫wait / waitpid)他, 那麼他將變成乙個殭屍程序。但是如果該程序的父程序已經先結束了,那麼該程序就不會變成殭屍程序, 因為每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序, 看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由init 程序來接管他,成為他的父程序......

由於子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法**子程序到底什麼時候結束. 那麼會不會因為父程序太忙來不及wait子程序,或者說不知道子程序什麼時候結束,而丟失子程序結束時的狀態資訊呢? 不會。因為unⅸ提供了一種機制可以保證只要父程序想知道子程序結束時的狀態資訊, 就可以得到。這種機制就是: 在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等。但是仍然為其保留一定的資訊(包括程序號the process id,退出狀態the termination status of the process,執行時間the amount of cpu time taken by the process等)。直到父程序通過wait / waitpid來取時才釋放. 但這樣就導致了問題,如果程序不呼叫wait / waitpid的話,那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生殭屍程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。

乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被殭屍程序銷毀, 而是留下乙個稱為殭屍程序(zombie)的資料結構(系統呼叫exit,它的作用是 使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀)。

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

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

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

4. 還有一些技巧,就是fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork乙個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的** 還要自己做。

linux之殭屍程序 孤兒程序

殭屍程序即為程序已經執行完畢,但是其父程序沒有呼叫wait waitpid,則該程序將變成乙個殭屍程序,雖然沒有執行,但占用系統中的乙個pcb空間。殭屍程序多的話,可以將系統卡死。殭屍程序的實現為 使用folk建立乙個子程序,讓子程序進來之後很快就退出,父程序什麼也不做,即沒有呼叫wait wait...

Linux 殭屍程序

怎樣產生殭屍程序的 乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序 zombie 的資料結構 系統呼叫 exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀 在linux程序的狀態中,殭屍程序是非常特殊的...

linux殭屍程序

僵死程序 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取得子程序的終止狀態。如果父程序沒有這麼做的話,子程序雖然已經退出了,但是在系統程序表中...