模擬實現殭屍程序

2021-08-18 17:45:46 字數 1171 閱讀 9438

當程序退出並且父程序沒有讀取到子程序退出返回的**時就會產生殭屍程序。乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的銷毀, 而是留下乙個稱為殭屍程序(zombie)的資料結構(系統呼叫exit,它的作用是 使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀)以終止狀態儲存在程序表中。

結果演示:

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

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

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

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

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

模擬實現殭屍程序, 孤兒程序

在linux下程序有多種狀態以下就是我列舉的一些狀態 r執行狀態 running 並不意味著程序一定在執行中,它表明程序要麼在執行中要麼在執行佇列裡。s睡眠狀態 sleeping 意味著程序在等待事件的完成 這裡的睡眠有時候也會叫可中斷睡眠 interruptible sleep d磁碟休眠狀態 d...

模擬實現殭屍程序, 孤兒程序

殭屍狀態是乙個比較特殊的狀態。當程序退出並且父程序 使用wait 系統呼叫 沒有讀取到子程序退出的返回 時就會產生殭屍程序。殭屍程序會終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態 所以,只要子程序退出,父程序還在執行,但父程序沒有讀取子程序狀態,子程序進入z狀態。從上圖我們可以看出,1...

模擬實現殭屍程序和孤兒程序

殭屍程序 乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。程序在終止時,系統會 所有核心分配給它的記憶體 關閉它開啟的所有檔案等等,但還會保留一些極少的資訊,因為 程序終止後有些資訊對於父程序和核心還是很有用的,例如程序的id號 程序的退出狀態 程序執行...