亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

守護進程之守護進程的慣例

2024-06-28 13:28:05
字體:
來源:轉載
供稿:網友
守護進程之守護進程的慣例

在UNIX系統中,守護進程遵循下列公共慣例:

  • 若守護進程使用鎖文件,那么該文件通常存放在/var/run目錄中。注意,守護進程可能需要具有超級用戶權限才能在此目錄下創建文件。鎖文件的名字通常是name.pid,其中,name是該守護進程或服務的名字。例如cron守護進程鎖文件的名字是/var/run/crond.pid。
  • 若守護進程支持配置選項,那么配置文件通常存放在/etc目錄中。配置文件的名字通常是name.conf,其中,name是該守護進程或服務的名字。例如,syslogd守護進程的配置文件是/etc/syslog.conf。
  • 守護進程可用命令行啟動,但通常它們是由系統初始化腳本之一(/etc/rc*或/etc/init.d/*)啟動的。如果在守護進程終止時,應當自動地重新啟動它,則我們可在/etc/inittab中為該守護進程包括_respawn記錄項,這樣,init就將重啟動該守護進程。
  • 若一守護進程有一配置文件,那么當該守護進程啟動時,它讀該文件,但在此之后一般就不會再查看它。若一管理員更改了配置文件,那么該守護進程可能需要被停止,然后再啟動,以使配置文件的更改生效。為避免此種麻煩,某些守護進程將捕捉SIGHUP信號,當它們接收到該信號時,重讀配置文件。因為守護進程并不與終端相結合,它們或者是無控制終端的會話首進程,或者是孤兒進程組的成員,所以守護進程并不期望接收SIGHUP。于是,它們可以安全地重復使用它。

實例

程序清單13-3所示程序說明了守護進程可以重讀其配置文件的一種方法。該程序使用sigwait以及多線程(可參考http://www.CUOXin.com/nufangrensheng/p/3540453.html)。

程序清單13-3 守護進程重讀配置文件

#include "apue.h"#include <pthread.h>#include <syslog.h>sigset_t    mask;extern int already_running(void);void reread(void){    /* ... */}void *thr_fn(void *arg){    int err, signo;    for(;;)    {        err = sigwait(&mask, &signo);        if(err != 0)        {            syslog(LOG_ERR, "sigwait failed");            exit(1);        }            switch(signo)        {            case SIGHUP:                syslog(LOG_INFO, "Re-reading configuration file");                reread();                break;                    case SIGTERM:                syslog(LOG_INFO, "got SIGTERM; exiting");                exit(0);            default:                syslog(LOG_INFO, "unexpected signal %d/n", signo);        }    }    return(0);}intmain(int argc, char *argv[]){    int                 err;    pthread_t           tid;    char                *cmd;    struct sigaction    sa;        if((cmd = strrchr(argv[0], '/')) == NULL)        cmd = argv[0];    else        cmd++;        /*    * Become a daemon.    */        daemonize(cmd);    /*    * Make sure only one copy of the daemon is running.    */    if(already_running())    {            syslog(LOG_ERR, "daemon already running");        exit(1);    }    /*    * 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);}

該程序調用http://www.CUOXin.com/nufangrensheng/p/3544104.html中的daemonize以初始化守護進程。從該函數返回后,調用http://www.CUOXin.com/nufangrensheng/p/3544370.html中的already_running函數以確保該守護進程只有一個副本在運行。到達這一點時,SIGHUP信號仍被忽略(???),所以需要恢復對該信號的系統默認處理方式;否則調用sigwait的線程決不會見到該信號。

如同對多線程程序所推薦的那樣,我們阻塞所以信號,然后創建一線程,由它來處理信號。該線程的唯一工作是等待SIGHUP和SIGTERM。當接收到SIGHUP信號時,該線程調用reread函數重讀它的配置文件。當它接收到SIGTERM信號時,記錄一消息,然后終止。

回憶http://www.CUOXin.com/nufangrensheng/p/3514157.html中的表10-1,對于SIGHUP和SIGTERM的默認動作是終止進程。因為我們阻塞了這些信號,所以當對進程產生這些信號時,守護進程不會消亡,而是調用sigwait的線程在返回時將指示已接收到該信號。

實例

如在http://www.CUOXin.com/nufangrensheng/p/3540453.html中所說的那樣,linux線程對于信號的處理方式與眾不同。由于這一點,在程序清單13-3中對信號標識合適的進程是困難的。另外,由于實現的差別,不能保證守護進程將按所期望的那樣作出反應。

程序清單13-4說明守護進程無需使用多線程也可以捕捉SIGHUP并重讀其配置文件。

#include "apue.h"#include <syslog.h>#include <errno.h>extern int lockfile(int);extern int already_running(void);void reread(void){    /* ... */}void sigterm(int signo){    syslog(LOG_INFO, "got SIGTERM; exiting");    exit(0);}voidsighup(int signo){    syslog(LOG_INFO, "Re-reading configuration file");    reread();}intmain(int argc, char *argv[]){        char            *cmd;    struct sigaction    sa;        if((cmd = strrchr(argv[0], '/')) == NULL)        cmd = argv[0];    else        cmd++;    /*    * Become a daemon.    */    daemonize(cmd);    /*    * Make sure only one copy of the daemon is running.    */    if(already_running())    {        syslog(LOG_ERR, "daemon already running");        exit(1);    }        /*    * 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)    {        syslog(LOG_ERR, "can't catch SIGTERM: %s", strerror(errno));        exit(1);    }    sa.sa_handler = sighup;    sigemptyset(&sa.sa_mask);    sigaddset(&sa.sa_mask, SIGTERM);    sa.sa_flags = 0;    if(sigaction(SIGHUP, &sa, NULL) < 0)    {        syslog(LOG_ERR, "can't catch SIGHUP: %s", strerror(errno));        exit(1);    }    /*    * Proceed with the rest of the daemon.    */    /* ... */    exit(0);  }

在初始化守護進程后,我們為SIGHUP和SIGTERM配置信號處理程序。我們可以將重讀邏輯放在信號處理程序中,也可以只在其中設置一個標志,由守護進程的主線程做所有所需的工作。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一区二区三区四区在线| 一区二区欧美激情| 黑人巨大精品欧美一区免费视频| 日韩在线欧美在线国产在线| 亚洲的天堂在线中文字幕| 亚洲欧美一区二区三区久久| 亚洲最大av网站| 91久久久久久久久久| 中文字幕亚洲欧美日韩2019| 亚洲一区亚洲二区亚洲三区| 狠狠躁18三区二区一区| 日韩av观看网址| 一区二区亚洲欧洲国产日韩| 国产精品劲爆视频| 亚洲精品视频在线播放| 欧美精品日韩三级| 亚洲精品国产精品国产自| 日韩免费看的电影电视剧大全| 亚洲精品日韩激情在线电影| 一区二区三区视频免费在线观看| 欧洲亚洲免费视频| 91精品视频在线播放| 国产国语videosex另类| 欧美电影免费观看电视剧大全| 欧美日韩中文在线| 国产91精品久久久久久久| 91wwwcom在线观看| 欧美黄色www| 高跟丝袜一区二区三区| 国产欧美精品日韩| 热re91久久精品国99热蜜臀| 亚洲电影中文字幕| 欧美黑人巨大xxx极品| 日韩美女在线观看一区| 欧美孕妇与黑人孕交| 亚洲跨种族黑人xxx| 久久人人爽人人爽爽久久| 亚洲激情视频网| 欧美日韩精品在线观看| 欧美亚洲另类激情另类| 亚洲在线视频观看| 中文字幕日韩欧美在线视频| 日韩成人av网址| 国产精品精品一区二区三区午夜版| 操91在线视频| 亚洲人成77777在线观看网| 亚洲**2019国产| 国产精品久久久久久久久免费| 国产成人精品免费久久久久| 一区二区欧美在线| 亚洲少妇激情视频| 国产精品视频精品| 精品亚洲永久免费精品| 精品久久久久久久久久久久久| 日韩成人网免费视频| 午夜精品国产精品大乳美女| 国产精品视频地址| 久久久久久久999精品视频| 日韩在线激情视频| 久久精品久久精品亚洲人| 国内成人精品视频| 欧美韩日一区二区| 亚洲大尺度美女在线| 亚洲精品一区二区网址| 91精品视频免费看| 欧美日韩999| 欧美国产在线电影| 精品国内产的精品视频在线观看| 8050国产精品久久久久久| 国产精品自在线| 国产主播欧美精品| 久久视频在线观看免费| 日本精品在线视频| 亚洲欧美日韩成人| 中文字幕视频在线免费欧美日韩综合在线看| 色妞欧美日韩在线| 欧美大尺度激情区在线播放| 一个人www欧美| 日本不卡免费高清视频| 日韩av毛片网| 精品久久在线播放| 青草青草久热精品视频在线观看| **欧美日韩vr在线| 亚洲а∨天堂久久精品喷水| 久久精品夜夜夜夜夜久久| 国产精品日韩精品| 日韩av高清不卡| 中文字幕日韩欧美精品在线观看| 国产亚洲欧洲高清一区| 国产亚洲精品久久久久久| 国产91成人在在线播放| 成人免费看片视频| 91香蕉国产在线观看| 日韩精品免费观看| 亚洲欧美第一页| 91精品国产777在线观看| 羞羞色国产精品| 午夜精品一区二区三区在线播放| 色婷婷久久av| 久久久久久久久久久久久久久久久久av| 亚洲一区二区三| 国产精品久久色| 精品一区精品二区| 日日狠狠久久偷偷四色综合免费| 欧美性xxxx极品hd满灌| 亚洲精选中文字幕| 欧美激情视频一区二区三区不卡| 欧美成人sm免费视频| 亚洲a在线播放| 神马久久久久久| 欧美激情一区二区三级高清视频| 亚洲激情视频在线| 成人午夜两性视频| 亚洲欧美国产va在线影院| 精品国内亚洲在观看18黄| 亚洲精品一区二区久| 久久精品国产96久久久香蕉| 欧美精品国产精品日韩精品| 欧美最猛性xxxx| 日韩经典中文字幕在线观看| 91久久久亚洲精品| 国产999精品视频| 成人信息集中地欧美| 久久影院资源站| 欧美性69xxxx肥| 国产一区香蕉久久| 国产亚洲人成网站在线观看| 在线观看欧美成人| 欧美成人午夜剧场免费观看| 国产精品香蕉av| 欧洲成人在线视频| 国产一区二区香蕉| 久久精品国产v日韩v亚洲| 在线观看91久久久久久| 这里精品视频免费| 欧美亚洲激情在线| 国产精品福利在线观看网址| 久久天天躁狠狠躁夜夜躁2014| 欧美成人网在线| 97视频在线免费观看| 国产亚洲欧洲高清一区| 操日韩av在线电影| 亚洲人成电影网站色| 97视频在线看| 麻豆国产va免费精品高清在线| 中文字幕日本欧美| 亚洲成人久久久| 精品国产91久久久久久| 在线国产精品视频| 国产精品国产三级国产专播精品人| 欧美日韩另类在线| 亚洲成人久久网| 久久成人综合视频| 97婷婷涩涩精品一区| 草民午夜欧美限制a级福利片| 国产这里只有精品| 亚洲精品电影在线| 亚洲社区在线观看| 18久久久久久| 亚洲午夜国产成人av电影男同| 久久天天躁夜夜躁狠狠躁2022| 亚洲精品久久7777777| 91青草视频久久| 国产亚洲a∨片在线观看|