1. daemon 是後台程序
後台程序有些是核心的(kernel daemons),通常他們的父程序號是0,他們在系統啟動階段啟動;有些是使用者層的(user-level daemons),所有使用者層後台程式是 process group leaders 和 session leaders,而且程序組和會話中只有它乙個程序,它們中大部分的父程序是init;2. 程式設計規則在ubuntu 10.10 下,ps -efjc 檢視執行中的程序,可以看到像kswapd這樣的核心後台程序,它們的父程序號是2,而不是0,程序號為2的程序就是kthreadd,如下圖:
daemon 沒有控制終端,顯示為?
init 程序號是1,是第乙個啟動使用者程序,用於啟動系統服務;(具體參考lsah p32)
initd 用於啟動網路服務,不過不是在系統初始化時啟動,而是延遲到有網路連線請求的時候在啟動相應的服務,它會幀聽配置檔案中的所有網路埠,所以它也叫super-server;linux下的inet是xinetd,即extended inet;(具體參考man xinet)
1. 呼叫 umask 將檔案模式建立遮蔽字設定為0,不遮蔽任何許可權;2. 呼叫 fork,任何使父程序退出;
執行 shell 命令的時候,shell 會 fork 乙個程序,如果是通過 shell 命令來啟動該 daemon 的,那麼 shell 認為這條命令已經執行完畢了,而 daemon 程式已經在後台執行了;
子程序繼承了父程序的程序組id,但不是程序組的 leader,這是呼叫 setsid,並成為 session leader 的前提;
3. 呼叫 setsid 建立乙個新會話。那麼這個 daemon 程式就成為了新程序組的leader,而且沒有控制終端,如果呼叫之前有,也會被解除關聯。(控制終端,參考 9.6)3. 日誌4. 當前工作目錄改為根目錄。daemon 的父程序的當前目錄可以是乙個 mounted 的目錄,如果daemon繼承後不改變的話,那麼這個檔案系統不能在 daemon 執行的時候不能被解除安裝,這不是我們希望的,而根檔案系統隨系統一直存在;
一些特殊的 daemon 也會設定到其他目錄;
5. 關閉不需要的檔案描述符;
6. 在/dev/null 上 開啟檔案描述符 0, 1, 2,這麼做是為了關閉不必要的互動功能,因為有些例程試圖讀取標準輸入/輸出/錯誤;因為沒有控制終端,所以 daemon 的任何輸出,不會出現在認識顯示裝置上,也會從互動裝置上的到任何輸入(鍵盤等);同時,會話的關閉也不會影響 daemon ;
下面是乙個書中 daemon 初始化的**,關注第二個 fork:
#include "apue.h"
#include #include #include void
daemonize(const char *cmd)
}
daemon 不能寫寫終端,它通過日誌記錄出錯資訊;產生日誌訊息的三種方式:
核心呼叫 log 函式
大多數使用者程序呼叫 syslog 函式
通過網路程式設計,傳送 udp 資料報到埠 514
#include void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
int setlogmask(int maskpri);
indent 指向的字串會被加入到日誌訊息中去,一般是寫 程式名稱;
option 指示日誌訊息處理方式,log_cons 必要是傳送到終端;log_ndelay 直接開啟用於傳送日誌訊息的 socket ,而不能等到寫入第乙個訊息的時候才產生,和log_odelay相反;log_nowait 和等待子程序的 wait 函式相關;log_perror 不僅把日誌訊息傳送非 syslogd ,還傳送到標準輸出上;log_pid 訊息中包含程序id
facility 表示訊息的**,或者型別
figure 13.4. the facility argument for openlog
level 指示日誌訊息的重要程度,這裡可以了解一些單詞的用法:emergency > alert > critical > error > warning > notice > information > debug
例子:
syslog (log_err | log_lpr, "open error for %s: %m", filename);4. daemon 有時候需要保證只有乙個例程在執行,這是需要用到檔案和記錄鎖機制:daemon 建立乙個檔案,然後給這個檔案加一把寫入鎖。-->這個檔案一般就是 /var/run/ 下面的 *.pid 檔案;syslog 之前沒有 openlog的話,可以通過上面的方式來指定 priority 型別;
5. daemon conventions
1. 鎖檔案通常是/var/run/*.pid;2. 配置檔案通常在/etc/,名字為name.conf,如/etc/syslog.conf;
3. 守護程序可用命令列啟動,通常由系統初始化指令碼( /etc/rc* 或者 /etc/inittab )啟動。如果需要在守護程序終止是,能自動重啟它,需要在 /etc/inittab 中為該守護程序新增 _respawn 記錄項;
4. 守護程序可以通過捕捉 sighup 訊號,來重新讀取配置檔案;
APUE學習筆記 19 守護程序
by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 13章。2.總結了守護程序的基本概念 程式設計規則以及如何進行出錯處理。3.守護程序 守護程序也稱精靈程序 daemon 是生存期較長的一種程序。它們常常在系統自舉時啟動,...
APUE讀書筆記 第十三章 守護程序
使用者層守護程序的父程序是init程序 守護程序編寫規則 1 umask將檔案模式建立遮蔽字設定為乙個已知值 通常為0 2 呼叫fork,然後使父程序exit,保證了子程序不是乙個程序組的組長程序 3 呼叫setsid建立乙個新會話,由於該程序不是乙個程序組的組長程序,會發生以下三件事 a 該程序變...
守護程序筆記
1 守護程序是脫離於 終端並且在 後台執行的程序。守護程序脫離於 終端是為了避免程序在執行過程中的資訊在任何終端上顯示並且程序也不會被任何終端所產生的終端資訊所打斷。2 由於在linux中,每乙個系統與使用者進行交流的介面稱為終端,每乙個從此終端開始執行的程序都會依附於這個終端,這個終端就稱為這些程...