在unix系統中,守護程序遵循下列公共慣例:
例項
程式清單13-3所示程式說明了守護程序可以重讀其配置檔案的一種方法。該程式使用sigwait以及多執行緒(可參考
程式清單13-3 守護程序重讀配置檔案
#include "apue.h
"#include
#include
sigset_t mask;
extern
int already_running(void
);void
reread(
void
)void *thr_fn(
void *arg)
switch
(signo)
}return(0);}
intmain(
int argc, char *argv)
/** restore sighup default and block all signals.
*/sa.sa_handler =sig_dfl;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0
;
if(sigaction(sighup, &sa, null) < 0
) err_quit(
"%s: can't restore sighup default");
sigfillset(&mask);
if((err = pthread_sigmask(sig_block, &mask, null)) != 0
) err_exit(err,
"sig_block error");
/** create a thread to handle sighup and sigterm.
*/err = pthread_create(&tid, null, thr_fn, 0
);
if(err != 0
) err_exit(err,
"can't create thread");
/** proceed with the rest of the daemon.
*//*
...
*/exit(0);
}
該程式呼叫中的daemonize以初始化守護程序。從該函式返回後,呼叫中的already_running函式以確保該守護程序只有乙個副本在執行。到達這一點時,sighup訊號仍被忽略(???),所以需要恢復對該訊號的系統預設處理方式;否則呼叫sigwait的執行緒決不會見到該訊號。
如同對多執行緒程式所推薦的那樣,我們阻塞所以訊號,然後建立一線程,由它來處理訊號。該執行緒的唯一工作是等待sighup和sigterm。當接收到sighup訊號時,該執行緒呼叫reread函式重讀它的配置檔案。當它接收到sigterm訊號時,記錄一訊息,然後終止。
回憶中的表10-1,對於sighup和sigterm的預設動作是終止程序。因為我們阻塞了這些訊號,所以當對程序產生這些訊號時,守護程序不會消亡,而是呼叫sigwait的執行緒在返回時將指示已接收到該訊號。
例項
如在中所說的那樣,linux執行緒對於訊號的處理方式與眾不同。由於這一點,在程式清單13-3中對訊號標識合適的程序是困難的。另外,由於實現的差別,不能保證守護程序將按所期望的那樣作出反應。
程式清單13-4說明守護程序無需使用多執行緒也可以捕捉sighup並重讀其配置檔案。
#include "apue.h
"#include
#include
extern
int lockfile(int
);extern
int already_running(void
);void
reread(
void
)void
sigterm(
intsigno)
void
sighup(
intsigno)
intmain(
int argc, char *argv)
/** handle signals of interest.
*/sa.sa_handler =sigterm;
sigempty(&sa.sa_mask);
sigaddset(&sa.sa_mask, sighup);
sa.sa_flags = 0
;
if(sigaction(sigterm, &sa, null) < 0
)
sa.sa_handler =sighup;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, sigterm);
sa.sa_flags = 0
;
if(sigaction(sighup, &sa, null) < 0
)
/** proceed with the rest of the daemon.
*//*
...
*/exit(
0);
}
在初始化守護程序後,我們為sighup和sigterm配置訊號處理程式。我們可以將重讀邏輯放在訊號處理程式中,也可以只在其中設定乙個標誌,由守護程序的主線程做所有所需的工作。
本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:。
守護程序之單例項守護程序
為了正常執行,某些守護程序實現為單例項的,也就是在任一時刻只執行該守護程序的乙個副本。例如,該守護程序可能需要排它地訪問乙個裝置。在cron守護程序情況下,如果同時有多個例項執行,那麼每個副本都可能試圖開始某個預定的操作,於是造成該操作的重複執行,這很可能導致出錯。如果守護程序需要訪問一裝置,而該裝...
守護程序及守護程序輸出
1 建立乙個輸出程式 2 建立乙個守護程序 1 建立乙個輸出程式 守護程序不與終端聯絡,所以,需要另外建立乙個程式用於輸出。也可以直接使用 bin echo example daemon help.cc include int main int argc,char argv else if argc...
守護程序及守護程序輸出
1 建立乙個輸出程式 2 建立乙個守護程序 1 建立乙個輸出程式 守護程序不與終端聯絡,所以,需要另外建立乙個程式用於輸出。也可以直接使用 bin echo example daemon help.cc include int main int argc,char ar else if argc 2...