天天看點

編寫daemon守護程序

編寫daemon守護程序

如何編寫daemon守護程序??

1.   調用fork()函數建立子程序後,讓父程序立即exit(),這樣産生的子程序變成孤兒程序,由init程序接管。

2.   調用setsid()函數,使得新建立的程序脫離控制終端,同時建立新的程序組,并成為該程序組的首程序。在linux系統中,所有的程序都屬于各自的程序組,程序組是一個或多個程序的集合,一個程序組中至少有一個程序成員,否則就消亡了。每個程序組都有一個程序組ID,是由領頭程序的程序号決定的,會話則是一個或多個程序組的集合,每個會話都有一個領頭程序,會話和程序組是linux核心用于管理多使用者情況下使用者程序的方法,每個程序都屬于一個程序組,而程序組又屬于某個會話,當使用者從終端登入系統時,系統會建立一個新的會話,在該終端上啟動的程序都會被系統劃歸到會話的程序組中。會話中的程序通過該會話中的領頭程序與一個終端相連,該終端是會話的控制終端,一個會話隻能有一個控制終端,如果會話存在一個控制終端時,則它必然擁有一個前台程序組,屬于該組的程序可以從從控制終端獲得輸入。由于守護程序沒有控制終端,而使用fork()函數建立的子程序會繼承父程序的控制終端,會話和程序組,是以,必須用setsid()建立新的會話,以脫離父程序的影響。Setsid函數将建立新的會話,并使得調用setsid函數的程序成為新會話的領頭程序。調用setsid函數的程序是新建立會話中的唯一的程序組,程序組ID為調用程序的程序号。Setsid函數産生這一結果還有個條件,即調用程序不為一個程序的領頭程序。由于在第一步調用fork的父程序退出,使得子程序不可能是程序組的領頭程序。該會話的領頭程序沒有控制終端與其相連,至此,滿足了守護程序沒有控制終端的要求。

3.   更改目前工作目錄

使用fork()函數建立的子程序會繼承父程序的目前工作目錄,當程序工作沒有結束時,其工作目錄是不能被解除安裝的.為了防止此問題,守護程序一般要chdir()了數将其工作目錄更改到别的目錄下(一般為/根目錄,因為根目錄是永遠不會被解除安裝的,除非關機).

4.   關閉檔案描述符,并重定向标準輸入,輸出和錯誤

子程序會繼承父程序某些打開了的檔案描述符,如果不使用這些檔案描述符,則需要關閉它們.守護程序是運作在系統背景的,不應該在終端有任何的輸出資訊,可以使用dup()函數将其重定向到/dev/null空裝置上.

5.   設定守護程序的檔案權限建立掩碼

守護程序會建立一些臨時檔案,出于性的考慮,往往不希望這些檔案被别的使用者檢視,這時可以用umask()函數修改檔案權限,建立掩碼的取值.

總結:

由于守護程序的特點,守護程序往往作為伺服器(Server)程序。例如,syslogd守護程序用來接收其他守護程序發送的消息。其他的守護程序是作為客戶機(Client)存在的。一般情況下,伺服器是一個為客戶機服務的程序。客戶機給伺服器發送服務請求,伺服器相應這種請求。這一工作模式存在于很多場合,例如,常見的ftp伺服器、telnet伺服器等。

繼續閱讀