1.守護進程的特徵
守護進程也稱精靈進程是生存期長的一種進程,它們常常在系統引導裝入時啟動,在系統管比時終止。守護進程沒有控制終端,所以它們是在後台啟動並執行。守護進程是一種很有用的進程。 Linux的大多數伺服器就是用守護進程實現的。比如,Internet伺服器inetd,Web伺服器httpd等。同時,守護進程完成許多系統任務。比如,作業規划進程crond,列印進程lpd等。
所有守護進程都以超級使用者(使用者ID為0)的優先權運行。沒有一個守護進程具有控制終端,控制名稱設定為(?)、終端前台進程組ID設定為-1。除update以外的所有守護進程都是組的首進程,對話期的首進程,而且是這些進程組和對話期中的唯一進程。所以的守護進程的父進程都是init進程。
守護進程最重要的特性是後台運行。在這一點上DOS下的常駐記憶體程式TSR與之相似。其次,守護進程必須與其運行前的環境隔離開來。這些環境包括未關閉的檔案描述符,控制終端,會話和進程組,工作目錄以及檔案建立掩模等。這些環境通常是守護進程從執行它的父進程(特別是shell)中繼承下來的。最後,守護進程的啟動方式有其特殊之處。它可以在Linux系統啟動時從啟動指令碼/etc/rc.d中啟動,可以由作業規划進程crond啟動,還可以由使用者終端(通常是shell)執行。
2.編程規則
1).首先做的是調用fork,然後使父進程exit
2).調用setsid以建立一個新對話期
3).將當前工作目錄更改為根目錄
4).將檔案方式建立屏蔽字設定為0
5).關閉不再需要的檔案描述符
6).某些守護進程開啟/dev/null使其具有檔案描述符0,1,2,這樣,任何一個試圖讀標準輸入、寫標準輸出或標準出錯的庫曆程都不會產生任何效果。
3.出錯記錄
大多數守護進程使用syslog設施(守護進程出錯記錄措施)。顯示了syslog設施的詳細組織圖。
該設施的介面函數:
#include <syslog.h>void openlog(const char *ident, int option, int facility);void syslog(int priority, const char *format, ...);void closelog(void);int setlogmask(int maskpri);//返回之前日誌優先順序掩碼值。
4.守護進程的慣例
1).如果守護進程使用一個鎖檔案,那麼檔案通常儲存在/var/run目錄下。
2).如果守護進程支援配置選項,那麼它們通常被儲存在/etc目錄中。
3).守護進程可以通過命令列啟動,但是通常它們是由系統初始化指令碼之一(/etc/rc*或/etc/init.d/*)啟動的
4).如果一守護進程有一個設定檔,那麼當該守護進程啟動時,它讀該檔案,但是此之後一般就不會再次查看它