備忘錄 殭屍程序與孤兒程序以及一些程序間的知識

2021-06-23 06:39:01 字數 1509 閱讀 2360

首先兩者的共同點都是父程序結束後遺留下來的程序。

然後是區別

文引殭屍程序和孤兒程序的區別—anker

—————————————引 用————————————————————

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

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

————————————引 用 結 束————————————————————

顯然殭屍程序危害挺大啊~所以該如何避免呢?

基本上的思路都是直接或者間接的呼叫wait()或者waitpid()函式。

基本有以下幾種:文引殭屍程序—道客巴巴

—————————————引 用—————————————————————

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

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

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

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

————————————引 用 結 束————————————————————

基本上辦法4是用來玩的,方法2和3是方法1的變種,感覺2和3比較靠譜。

關於wait和waitpd兩個函式,我覺得有必要記下來區分一下。

wait(int * status)函式:父程序進入阻塞,

等待任意乙個子程序訊號傳來。引數傳回該子程序結束狀態。

waitpid(pid_t pid, int * status, int options)函式:傳入乙個pid,針對該pid進行分類處理。

a)當pid<-1時,等待程序組識別碼為 pid 絕對值的任何子程序。

b)當pid=-1時,等待任何子程序,相當於 wait()。

c)當pid=0時,等待程序組識別碼與目前程序相同的任何子程序。

d)當pid>0時,等待任何子程序識別碼為 pid 的子程序。

另乙個引數options傳入值為一些選項,具體的選項在man手冊可以查到此處不表,不同的引數可以用『|』連線起來。

殭屍程序和孤兒程序的區別—anker

殭屍程序—道客巴巴

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

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

殭屍程序與孤兒程序

殭屍程序 如果乙個程序通過fork 建立子了乙個程序,當子程序退出而父程序還沒有呼叫wait waitpid來儲存子程序的狀態且 它,此時子程序的狀態描述資訊仍然保留在系統中,稱這類程序為殭屍程序 殭屍程序的優點是方便上層程序得知子程序的退出狀態,但是如果不及時 會造成記憶體洩露 孤兒程序 當乙個父...

殭屍程序與孤兒程序

孤兒程序是指在程序還未退出之前它的父程序就已經先退出了,簡單來說就是乙個沒有父程序的子程序就是孤兒程序。既然所有的程序都必須在退出之後被父程序的wait 或waitpid 以釋放其遺留在系統中的一些資源,那麼孤兒程序的這些東西又誰來處理呢?這個任務就落到了init程序的身上,init程序就好像乙個收...