在編寫守護程序時需遵循一些基本規則,以便防止產生並不需要的互動作用。下面先說明這些規則,然後給出乙個按照這些規則編寫的函式daemonize。
(1)首先要做的是呼叫umask將檔案模式建立遮蔽字設定為0。由繼承得來的檔案模式建立遮蔽字可能會拒絕設定某些許可權。例如,若守護程序要建立乙個組可讀、寫的檔案,而繼承的檔案模式建立遮蔽字可能遮蔽了這兩種許可權,於是所要求的組可讀、寫就不能起作用。
(2)呼叫fork,然後使父程序退出(exit)。這樣做實現了下面幾點:第一,如果該守護程序是作為一條簡單shell命令啟動的,那麼父程序終止使得shell認為這條命令已經執行完畢(也就沒有了控制終端);第二,子程序繼承了父程序的程序組id,但具有乙個新的程序id,這就保證了子程序不是乙個程序組的組長程序。這對於下面就要做的setsid呼叫是必要的前提條件。
(3)呼叫setsid以建立乙個新會話。於是執行中列舉的三個操作,使呼叫程序:(a)成為新會話的首程序,(b)成為乙個新程序組的組長程序,(c)沒有控制終端。
在基於系統v的系統中,有些人建議在此時再次呼叫fork,並使父程序終止。第二個子程序作為守護程序繼續執行。這樣就保證了該守護程序不是會話首程序,於是按照系統v規則(見
)可以防止它取得控制終端。避免取得控制終端的另一種方法是,無論何時開啟乙個終端裝置都一定要指定o_noctty。
(4)將當前工作目錄更改為根目錄。從父程序出繼承過來的當前工作目錄可能在乙個掛載的檔案系統(a mounted file system)中。因為守護程序通常在系統再引導之前是一直存在的,所以如果守護程序的當前工作目錄在乙個掛載的檔案系統中,那麼該檔案系統就不能被解除安裝。這與掛載檔案系統的原意不符。
另外,某些守護程序可能會把當前工作目錄更改到某個指定位置,在那裡做它們的工作,例如,行式印表機假離線守護程序常常將其工作目錄更改到它們的spool目錄上。
(5)關閉不再需要的檔案描述符。這使守護程序不再持有從其父程序繼承來的某些檔案描述符(父程序可能是shell程序,或某個其他程序)。可以使用中程式清單2-4中的open_max函式或getrlimit函式(來判定最高檔案描述符值,並關閉直到該值的所有描述符。
(6)某些守護程序開啟/dev/null使其具有檔案描述符0、1和2,這樣,任何乙個試圖讀標準輸入、寫標準輸出和標準出錯的庫例程都不會產生任何效果。因為守護程序並不與終端裝置相關聯,所以不能在終端裝置上顯示其輸出,也無處從互動式使用者那裡接受輸入。即使守護程序是從互動式會話啟動的,但因為守護程序是在後台執行的,所以登入會話的終止並不影響守護程序。如果其他使用者在同一終端裝置上登入,我們也不會在該終端上見到守護程序的輸出,使用者也不可期望他們在終端上的輸入會由守護程序讀取。
例項
程式清單13-1是個函式,可由想初始化成為乙個守護程序的程式呼叫。
程式清單13-1 初始化乙個守護程序
#include "apue.h
"#include
#include
#include
void
daemonize(
const
char *cmd)
}
本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:。
守護程序之程式設計規則
在編寫守護程序時需遵循一些基本規則,以便防止產生並不需要的互動作用。下面先說明這些規則,然後給出乙個按照這些規則編寫的函式daemonize。1 首先要做的是呼叫umask將檔案模式建立遮蔽字設定為0。由繼承得來的檔案模式建立遮蔽字可能會拒絕設定某些許可權。例如,若守護程序要建立乙個組可讀 寫的檔案...
守護程序的程式設計規則
要理解守護程序的程式設計規則必須先搞明白程序組 會話 組長程序等關係。1.程序組 每個程序除了有乙個程序id之外,還屬於乙個程序組。程序組是乙個或者多個程序的集合。每個程序組都有乙個組長程序。組長程序的標識是,其程序id和程序組id相等。2.會話 會話是乙個或者多個程序組的集合。程序可以呼叫sets...
併發程式設計之 守護程序
一,守護程序 守護程序其實就是乙個 子程序 守護 伴隨 守護程序會伴隨主程序的 執行完畢後而死掉。二,為何用守護程序?關鍵字就兩個 程序 當父程序需要將乙個任務併發出去執行,需要將該任務放到乙個子程序裡。守護 當該子程序內的 在父程序 執行完畢後就沒有任何存在的意義了,就應該將該子程序設定為 守護程...