孤兒程序以及殭屍程序總結

2021-10-19 08:19:02 字數 2051 閱讀 1701

我們知道在unix/linux中,正常情況下,子程序是通過父程序建立的,子程序在建立新的程序。子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法**子程序 到底什麼時候結束。 當乙個 程序完成它的工作終止之後,它的父程序需要呼叫wait()或者waitpid()系統呼叫取得子程序的終止狀態。

孤兒程序:

概念:乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。

當乙個程序終止時,核心會檢查所有的活動程序,找出正要終止程序的子程序,並將其父程序更改為init程序(程序號為1)。

殭屍程序:

概念:乙個程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為僵死程序。

核心會為每個終止子程序保留一定量的資訊,這些資訊至少包括程序id,程序的終止狀態,以及該程序使用的cpu時間,所以當終止子程序的父程序呼叫wait或waitpid時就可以得到這些資訊。如果父程序沒有呼叫wait函式的話,則該資源就會一直被占用。

那麼存在大量殭屍程序會怎麼樣?

如果程序不呼叫wait / waitpid的話, 那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。(換句話說,我們應該特別關注程序號!!!

當出現了較多的殭屍程序,我們是清除這些殭屍程序嗎?

其實不是的,如果真的出現了較多的殭屍程序,我們應該是要把其父程序殺死,把真正的幕後**乾掉,才是真正解決問題!殺死元凶程序之後,它產生的僵死程序就變成了孤兒進 程,這些孤兒程序會被init程序接管,init程序會wait()這些孤兒程序,釋放它們占用的系統程序表中的資源.

注:孤兒程序危害性不大,會有init程序等待其完成,但是殭屍程序的危害性較大!!!主要是程序號的霸佔!!!!

任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理。這是每個 子程序在結束時都要經過的階段。如果子程序在exit()之後,父程序沒有來得及處理,這時用ps命令就能看到子程序的狀態是「z」。如果父程序能及時 處理,可能用ps命令就來不及看到子程序的殭屍狀態,但這並不等於子程序不經過殭屍狀態。 如果父程序在子程序結束之前退出,則子程序將由init接管。init將會以父程序的身份對殭屍狀態的子程序進行處理。

wait和waitpid函式:父程序呼叫wait/waitpid等函式等待子程序結束,如果尚無子程序退出wait會導致父程序阻塞。waitpid可以通過傳遞wnohang使父程序不阻塞立即返回。

sigaction訊號處理函式(交給核心處理):如果父程序很忙可以用sigaction註冊訊號處理函式,在訊號處理函式呼叫wait/waitpid等待子程序退出。(sigaction函式類似於signal函式,而且完全可以代替後者,也更穩定)

signal忽略sigchld訊號(交給核心處理) :通過signal(sigchld, sig_ign)通知核心對子程序的結束不關心,由核心**。如果不想讓父程序掛起,可以在父程序中加入一條語句:signal(sigchld,sig_ign);表示父程序忽略sigchld訊號,該訊號是子程序退出的時候向父程序傳送的。

補充:忽略sigchld訊號,這常用於併發伺服器的效能的乙個技巧因為併發伺服器常常fork很多子程序,子程序終結之後需要伺服器程序去wait清理資源。如果將此訊號的處理方式設為忽略,可讓核心把殭屍子程序轉交給init程序去處理,省去了大量殭屍程序占用系統資源

fork兩次:通過兩次呼叫fork。父程序首先呼叫fork建立乙個子程序然後waitpid等待子程序退出,子程序再fork乙個孫程序後退出。這樣子程序退出後會被父程序等待**,而對於孫子程序其父程序已經退出所以孫程序成為乙個孤兒程序,孤兒程序由init程序接管,孫程序結束後,init會等待**。

孤兒程序 殭屍程序

殭屍程序和孤兒程序 殭屍程序 殭屍程序是乙個比較特殊的狀態,當程序退出並且父程序沒有讀取到子程序的退出碼,就會產生殭屍程序,殭屍程序會一直儲存在程序表中,並且一直等待父程序讀取退出狀態碼。所以,只要子程序退出,父程序還在執行,但是父程序沒有讀取到子程序的狀態,子程序就會進入殭屍狀態。建立乙個殭屍程序...

殭屍程序, 孤兒程序

一,定義 當程序退出並且父程序 使用wait 系統呼叫 沒有讀取到子程序退出的返回 時就會產生殭屍程序。殭屍程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態 簡單來說就是,在父程序中有乙個子程序,該子程序完成父程序交給的任務,子程序完成後會給父程序乙個任務結果返回,但父程序一直沒有...

殭屍程序 孤兒程序

程序在之前分為3個狀態 1.執行狀態 running 正在cpu中執行的程序。2.就緒狀態 ready 已獲得除了處理器外的所需資源,隨時準備著執行的程序。3.阻塞狀態 blocked 因為缺少除了cpu外的其他資源,無法滿足執行條件的程序。殭屍程序 乙個程序使用fork建立子程序,如果子程序退出,...