守護程序之守護程序的慣例

2021-09-06 13:46:28 字數 2875 閱讀 7661

在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...