UNIX高階環境程式設計 第13章 守護程序

2021-09-16 21:45:58 字數 1423 閱讀 2896

守護程序:沒有控制終端,長期執行在後台的程序

void daemonize(const char* cmd)  else if (pid != 0)
/*

*呼叫setsid以建立乙個新會話 使呼叫程序:

* a. 成為新會話的首程序,

* b. 成為乙個新程序組的組長程序,

* c. 沒有控制終端。

*/setsid();

struct sigaction sa;

sa.sa_handler = sig_ign;

sigemptyset(&sa.sa_mask);

if (sigaction(sighup, &sa, null) < 0)

/** 終止當前程序,使得下面的**的操作中無法獲取終端控制

* 因為只有會話首程序可以獲取終端控制。

* * 注意: sigaction函式的作用在此體現: 當關閉會話首程序時,核心會向所有處於

* 該會話的程序傳送sighup訊號,該訊號的預設處理函式是終止程序。

*/

if(pid = fork())

else if(pid < 0)

/*

* 將當前工作目錄更改為根目錄

* 從父程序出繼承過來的當前工作目錄可能在乙個掛載的檔案系統中。

* 因為守護程序通常在系統再引導之前是一直存在的,

* 所以如果守護程序的當前工作目錄在乙個掛載的檔案系統中,那麼該檔案系統就不能被解除安裝。

* 這與掛載檔案系統的原意不符。

* 某些守護程序可能會把當前工作目錄更改到某個指定位置,在那裡做它們的工作.

*/if (chdir("/") < 0)

struct rlimit rl;

if(getrlimit(rlimit_nofile, &rl) < 0)

/* *關閉繼承的檔案描述符

*/

if (rl.rlim_max == rlim_infinity)

for (i = 0; i < rl.rlim_max; i++)

int fd0, fd1, fd2;

fd0 = open("/dev/null", o_rdwr);

fd1 = dup(0);

fd2 = dup(0);

/*

* initialize the log file.

* cmd 函式名稱

*/openlog(cmd, log_cons, log_daemon);

if(fd0 != 0 || fd1 != 1 || fd2 != 2)

}

UNIX高階程式設計 第13章 守護程序

請移步到這 13.2 守護程序的特徵 注意,大多數守護程序都以超級使用者 root 特權執行。所有的守護程序都沒有控制終端,其終端名設定為問號。核心守護程序以無控制終端方式啟動。使用者層守護程序缺少控制終端可能是守護程序呼叫了setsid的結果。大多數使用者層守護程序都是程序組的組長程序以及會話的首...

UNIX環境高階程式設計(第1章 UNIX基礎知識)

本章從程式設計人員角度快速瀏覽unix,也為不熟悉unix的程式設計人員簡要介紹unix提供的各種服務。1.unix體系結構 核心 控制計算機硬體資源,提供程式執行環境的軟體。核心的介面 系統呼叫。圖1 1 unix作業系統的體系結構 2.登入 cat etc passwd root x 0 0 r...

UNIX環境高階程式設計之第10章 訊號

訊號是軟體中斷.很多比較重要的應用程式都需要處理訊號.訊號提供一種處理非同步時間的方法,例如,終端使用者鍵入中斷鍵,會通過訊號機制停止乙個程式,或及早終止管道中的下乙個程式.首先每個訊號都有乙個名字.這些名字都是以sig開頭.例如,sigabrt是夭折訊號,當程序呼叫abort函式是產生這種訊號.u...