天天看點

linux下daemon守護程序的實作(以nginx代碼為例)

setsid相關知識:

通過調用setsid函數,使得新建立的程序脫離控制終端,同時建立新的程序組,并成為該程序組的首程序。為了使讀者更好地了解這一步驟,下面介紹程序組、會話(session)的基本概念。

在Linux系統中,所有的程序都屬于各自的程序組。程序組是一個或多個程序的集合。打個比方,可以認為某個班級是一個程序組,而其中成員就是程序。一個班級至少有一個成員。當一個班級的最後一個成員不存在的時候,這個班級也就不存在了,也就是程序組消亡了。

每個程序組都有類似于程序号的辨別,稱為程序組ID。程序組ID是由領頭程序的程序号決定的,每個程序組都存在一個領頭程序。程序組的存在與否與領頭程序是否存在沒有關系。

會話是一個或多個程序組的集合。與程序組類似,每個會話都存在一個領頭程序。Linux是一個多使用者的作業系統,在同一時刻系統中會存在屬于不同使用者的多個程序。如果使用者在某個終端上發送了某個信号,例如,按下“Ctrl+C”發送SIGINT信号,如何確定信号被正确地發送到對應的程序,同時不會影響使用其他終端的使用者的程序?

會話和程序組是Linux核心用于管理多使用者情況下使用者程序的方法。每個程序都屬于一個程序組,而程序組又屬于某個會話。當使用者從終端登入系統(不管是終端還是僞終端),系統會建立一個新的會話。在該終端上啟動的程序都會被系統劃歸到會話的程序組中。

會話中的程序通過該會話中的領頭程序(常稱其為控制程序)與一個終端相連。該終端是會話的控制終端。一個會話隻能有一個控制終端,反之一樣。如果會話存在一個控制終端,則它必然擁有一個前台程序組。屬于該組的程序可以從控制終端獲得輸入。這時,其他的程序組都為背景程序組。圖8.3所示為會話、程序組、程序與控制終端之間的關系。

由于守護程序沒有控制終端,而使用fork函數建立的子程序繼承了父程序的控制終端、會話和程序組,是以,必須建立新的會話,以脫離父程序的影響。Linux系統提供了setsid函數用于建立新的會話。

setsid函數将建立新的會話,并使得調用setsid函數的程序成為新會話的領頭程序。調用setsid函數的程序是新建立會話中的惟一的程序組,程序組ID為調用程序的程序号。setsid函數産生這一結果還有個條件,即調用程序不為一個程序的領頭程序。由于在第一步中調用fork的父程序退出,使得子程序不可能是程序組的領頭程序。該會話的領頭程序沒有控制終端與其相連。至此,滿足了守護程序沒有控制終端的要求。

繼續閱讀