程序控制 孤兒程序和殭屍程序

2022-05-03 12:12:17 字數 2745 閱讀 8359

1、作業系統裡每開啟乙個程序都會建立乙個程序id,這是唯一標識程序的編號,即pid。

2、pid 在任何時刻都是唯一的,但是可以重用。當程序終止並被**以後,其 pid 就會被系統**

3、程序的 pid 由系統核心根據延遲重用演算法生成,以確保新程序的 pid 不同於最近終止程序的 pid。

4、程序pid的最大值是有限的(因系統的不同而不同),需要及時**

1 號程序:通常是 init 程序,在自舉過程結束時由核心呼叫。

2 號程序:頁守護程序:負責虛擬記憶體系統的分頁操作

1、建立新程序(子程序)--fork()

當呼叫fork()時,將執行以下動作:

1、向系統申請乙個新pid

2、建立子程序,複製父程序的pcb,獲得父程序的資料空間、堆、棧等資源的副本(但不是共享資源)

3、在父程序中返回子程序的pid,在子程序中返回0

執行完以上動作後,父程序和子程序便開始併發執行了。

注意:fork()函式可能有三種不同的返回值,並且呼叫一次,會返回兩個值:

1、返回0,表示當前在子程序中執行

2、返回建立子程序的pid,表示當前在父程序中執行

3、返回乙個負數,表示建立程序失敗

為什麼呼叫fork()一次會返回兩個不同的值?

呼叫fork()函式之前,只有乙個程序在執行(父程序),呼叫之後有兩個程序在執行,分別是父程序和子程序,注意,這個時候父程序和子程序都處於fork()函式之後的位置,不同的是父程序呼叫了fork()函式建立了子程序,但是子程序還沒有呼叫fork()函式建立自己的子程序,所以這兩個程序執行下去會返回不同的值

用**舉個例子

#include #include 

#include

intmain ()

else

printf(

"統計結果是: %d/n

",count);

return

0;

}

view code

同時,根據父程序和子程序返回的值不同,我們可以通過fork返回的值來判斷當前程序是子程序還是父程序。

2、exec()函式:載入新程式取代當前執行程序,pid保持不變

3、exit()函式:程式退出函式。返回0表示正常退出,其它退出異常

4、wait()函式:

功能(解決殭屍程序的方法)

父程序一旦呼叫了wait就立即阻塞自己,由wait自動分析當前程序的某個子程序是否已經正常退出,如果讓它找到了這樣乙個已經變成殭屍的子程序(異常),wait就會收集這個子程序的資訊,並把它徹底銷毀後返回,並喚醒父程序;如果沒有找到這樣乙個子程序,wait就會一直阻塞在這裡,直到有乙個出現為止。

父程序早於子程序退出時候子程序還在執行,子程序會成為孤兒程序。linux會對孤兒程序的處理,把孤兒程序的父程序設為1,也就是由init程序來託管。init程序負責子程序退出後的善後清理工作。

子程序退出後留下的程序資訊沒有被收集,會導致占用的程序控制塊pcb不被釋放,形成殭屍程序。程序已經死去,但是程序資源沒有被釋放掉。

1、孤兒程序的資源收集由init程序負責,當乙個孤兒程序淒涼地結束了其生命週期的時候,init程序就會處理它的一切善後工作。因此孤兒程序並不會有什麼危害。

2、如果系統中存在大量的殭屍程序,他們的程序號就會一直被占用,但是系統所能使用的程序號是有限的,系統將因為沒有可用的程序號而導致系統不能產生新的程序.。

任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理。這是每個

子程序在結束時都要經過的階段。如果子程序在exit()之後,父程序沒有來得及處理,這時用ps命令就能看到子程序的狀態是「z」。如果父程序能及時

處理,可能用ps命令就來不及看到子程序的殭屍狀態,但這並不等於子程序不經過殭屍狀態。 

如果父程序在子程序結束之前退出,則子程序將由init接管。init將會以父程序的身份對殭屍狀程的身份對殭屍狀態的子程序進行處理。

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

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

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

4、殺死父程序。 如果殭屍程序的父程序還存在,找到這個父程序,kill掉它。這樣就會變成3的情況,init會負責善後工作。

部分**自

殭屍程序和孤兒程序

殭屍程序 乙個子程序在其父程序還沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。孤兒程序 乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序 程序號為1 所收養,並由init程序對它們完成狀態收集工作。殭屍程序將會導致資源...

殭屍程序和孤兒程序

什麼是殭屍程序?乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到父程序結束後,會被init 驗證 include include includeint main 3秒後查詢其程序資訊 通過上...

殭屍程序和孤兒程序

殭屍程序和孤兒程序 在unix系統程式設計中,常常會碰到兩個概念 僵死程序和孤兒程序 僵死程序 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取...