fork兩次解決殭屍程序

2021-06-22 08:04:19 字數 1323 閱讀 9278

孤兒程序

孤兒程序是指父程序在子程序結束之前死亡(return 或exit)。如下圖1所示:

圖1  孤兒程序

但是孤兒程序並不會像上面畫的那樣持續很長時間,當系統發現孤兒程序時,init程序就收養孤兒程序,成為它的父親,child程序exit後的資源**就都由init程序來完成。

殭屍程序

殭屍程序是指子程序在父程序之前結束了,但是父程序沒有用wait或waitpid**子程序。如下圖所示:

圖2   殭屍程序

父程序沒有用wait**子程序並不說明它不會**子程序。子程序在結束的時候會給其父程序傳送乙個sigchild訊號,父程序預設是忽略sigchild訊號的,如果父程序通過signal()函式設定了sigchild的訊號處理函式,則在訊號處理函式中可以**子程序的資源。

事實上,即便是父程序沒有設定sigchild的訊號處理函式,也沒有關係,因為在父程序結束之前,子程序可以一直保持殭屍狀態,當父程序結束後,init程序就會負責**殭屍子程序。

但是,如果父程序是乙個伺服器程序,一直迴圈著不退出,那子程序就會一直保持著殭屍狀態。雖然殭屍程序不會占用任何記憶體資源,但是過多的殭屍程序總還是會影響系統效能的。黔驢技窮的情況下,該怎麼辦呢?

這個時候就需要乙個英雄來拯救整個世界,它就是兩次fork()技法。

兩次fork()技法

兩次fork()的流程如下所示:

圖3    兩次fork的控制流

如上圖3所示,為了避免子程序child成為殭屍程序,我們可以人為地建立乙個子程序child1,再讓child1成為工作子程序child2的父程序,child2出生後child1退出,這個時候child2相當於是child1產生的孤兒程序,這個孤兒程序由系統程序init**。這樣,當child2退出的時候,init就會**child2的資源,child2就不會成為孤魂野鬼禍國殃民了。

[cpp]view plain

copy

intmain(

void

)    

if(waitpid(pid, null, 0) != pid)        

/* wait for first child */

err_sys("waitpid error"

);  

/* we're the parent (the original process); we continue executing,

knowing that we're not the parent of the second child. */

exit(0);  

}  理所當然,第二個子程序的父程序是程序號為1的init程序。  

兩次fork防止殭屍程序

1 何謂殭屍程序?在linux系統中,乙個已經終止但父程序尚未對其進行善後處理 釋放子程序相關資訊占用的資源 的子程序叫做殭屍程序 子程序結束時,父程序呼叫pid t wait int statloc 或者pid t waitpid pid t pid,int statloc,int options...

為何要fork 兩次來避免產生殭屍程序?

當我們只fork 一次後,存在父程序和子程序。這時有兩種方法來避免產生殭屍程序 目前先考慮子程序先於父程序結束的情況 由此,可以看出父程序與子程序有父子關係,除非保證父程序先於子程序結束或者保證父程序在子程序結束前執行waitpid 子程序均有機會成為殭屍程序。那麼如何使父程序更方便地建立不會成為殭...

為何要fork 兩次來避免產生殭屍程序?

當我們只fork 一次後,存在父程序和子程序。這時有兩種方法來避免產生殭屍程序 目前先考慮子程序先於父程序結束的情況 由此,可以看出父程序與子程序有父子關係,除非保證父程序先於子程序結束或者保證父程序在子程序結束前執行waitpid 子程序均有機會成為殭屍程序。那麼如何使父程序更方便地建立不會成為殭...