linux伺服器程序為何通常fork 兩次

2021-07-10 13:12:43 字數 1379 閱讀 7793

**

首先,要了解什麼叫殭屍程序,什麼叫孤兒程序,以及伺服器程序執行所需要的一些條件。兩次fork()就是為了解決這些相關的問題而出現的一種程式設計方法。

孤兒程序

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

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

殭屍程序

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

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

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

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

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

兩次fork()技法

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

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

一言以蔽之,兩次fork()是為了防止系統中產生殭屍程序。

檢視Linux伺服器的程序

1 ps 程序檢視命令。格式 ps 選項 其主要選項如下 a 顯示系統中所有程序的資訊 e 顯示所有程序的資訊 f 顯示程序的所有資訊 l 以長格式顯示程序資訊 r 只顯示正在執行的程序 u 顯示面向使用者的格式 x 顯示所有非控制終端上的程序資訊 p 顯示由程序id指定的程序資訊 t 顯示指定終端...

linux多程序併發伺服器

多程序併發伺服器,多執行緒版 include include include include include include include include include include include 程序 函式 void recyle int num int main int argc,cha...

多程序伺服器

基於tcp實現多程序伺服器 伺服器端 1 建立套接字 include include int socket int domain,int type,int protocol domain 乙個位址描述。目前僅支援af inet格式,也就是說arpa internet位址格式。type 指定socke...