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

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

服務器編程入門(12) 守護進程

2024-06-28 13:27:04
字體:
來源:轉載
供稿:網友
服務器編程入門(12) 守護進程

摘要:

    在之前的《服務器編程入門(5)linux服務器程序規范》中,我們提到過將服務器程序后臺化,這就是本節將要討論的守護進程. 

    本節主要關注一下問題:  

    1 什么是守護進程?

    2 守護進程的啟動方法有哪些?

    3 如何創建一個守護進程?


1 什么是守護進程?

在后臺運行,且不與任何控制終端關聯的進程。

守護進程不與作業控制、終端會話管理、終端產生信號等發生交互,也可以避免在后臺運行的守護進程非預期地輸出到終端。

兩個特點:

  • 守護進程執行中的信息不顯示在任何一個終端上
  • 守護進程不被終端產生的無用信號所中斷

在理解更多關于守護進程的概念之前,我們先了解一下進程、進程組、會話期和控制終端的關系。

  • 每一個進程有一個進程ID,每個進程都屬于一個進程組
  • 每個進程組有一個組長進程組長進程的ID等于進程組ID
  • 會話期是一個或多個進程組的集合,一個會話期可以有一個單獨的控制終端(其中,只有一個前臺進程組可以控制終端的交互)
  • 從shell中啟動的每個進程將繼承一個終端,以便進程與用戶交互,同時繼承父進程的會話期和進程組ID,因此子進程會受發給該會話期或進程組的信號的影響。

守護進程與普通進程的區別如下圖所示:

守護進程

 


2 守護進程的啟動方法有哪些?
  1. 在系統啟動階段,許多守護進程又系統初始化腳本啟動。這些腳本通常位于/etc目錄或以/etc/rc開頭的某個目錄中。由這些腳本啟動的守護進程一開始時就擁有超級用戶特權。
  2. 許多網絡服務器由inetd超級服務器啟動。
  3. cron守護進程按照規則定期執行一些程序。由它啟動執行的程序同樣作為守護進程運行。
  4. at命令用于指定將來某個時刻運行程序,由它啟動的程序同樣作為守護進程。
  5. 從用戶終端或前臺或后臺啟動。

3 使用庫函數daemon創建守護進程

首先我們使用庫函數daemon創建守護進程,然后研究一下守護進程的創建過程,并實現一個守護進程化函數,達到和庫函數daemon相同的效果。

函數:daemon

聲明:

#include <unistd.h>int daemon(int nochdir, int noclose);

作用:通過在服務器程序中調用它,可以把一個普通進程轉變為守護進程。

參數說明:

If nochdir is zero, daemon()  changes  the  PRocess’s  current  working directory to the root directory ("/"); otherwise,

If  noclose is zero, daemon() redirects standard input, standard output and standard error to /dev/null; otherwise,  no  changes  are  made  to these file descriptors.

Demo:

#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <time.h>#include <fcntl.h>#include <string.h>#include <error.h>int main(int argc, char* argv[]) {    time_t t;    int fd;        // 將當前進程變成守護進程    if (daemon(0, 0) == -1) {        perror("daomon error");        exit(EXIT_FAILURE);    }    while(1) {        //這時工作目錄已經被daemon函數切換到了系統根目錄下        fd = open("daemon.log", O_WRONLY|O_CREAT|O_APPEND, 0644);           if (fd == -1) {            perror("open daemon.log error");            exit(EXIT_FAILURE);        }        t = time(0);        char *buf = asctime(localtime(&t));        write(fd, buf, strlen(buf));     //向daemon.log文件中寫入當前時間        close(fd);        sleep(60);    // 每隔60s寫入一次    }}

運行截圖:

image

執行ps命令發現,并沒有名為testDaemon的守護進程,主要原因是daemon函數會將當前工作目錄切換到/目錄下,而普通用戶沒有權限在系統根目錄創建文件。

所以實際上出錯在fd = open("daemon.log", O_WRONLY|O_CREAT|O_APPEND, 0644); 這里,又因為守護進程是不和當前終端交互的,所以沒有看到報錯信息。

現在我們切換到root用戶執行程序,運行截圖:

image

 


4 創建守護進程過程分析,用自己實現的myDaemon函數創建守護進程

守護進程創建過程:

守護進程創建流程

代碼實現:

#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <time.h>#include <fcntl.h>#include <string.h>#include <error.h>#include <signal.h>#define MAXFD 64extern int daemon_proc;int myDaemon(int ,int );int main(int argc, char* argv[]) {    time_t t;    int fd;        if (myDaemon(0, 0) == -1) {        perror("daomon error");        exit(EXIT_FAILURE);    }    while(1) {        fd = open("daemon.log", O_WRONLY|O_CREAT|O_APPEND, 0644);        if (fd == -1) {            perror("open daemon.log error");            exit(EXIT_FAILURE);        }        t = time(0);        char *buf = asctime(localtime(&t));        write(fd, buf, strlen(buf));        close(fd);        sleep(60);    }    fprintf(stderr,            "Hello world!/n");}int myDaemon(int nochdir, int noclose) {    int i;    pid_t pid;    if ( (pid = fork()) < 0 )        return -1;    else if (pid) {        /* parent terminated */        _exit(0);    }    /* child 1 continues... */    if (setsid() < 0)     /* become session leader */        return -1;    signal(SIGHUP, SIG_IGN);    /* ignore SIGHUP singal */    if ( (pid = fork()) < 0 )        return -1;    else if (pid) {        _exit(0);         /* child 1 terminated */    }    /* child 2 continues... */    daemon_proc = 1;      /* use syslog instead of fprintf to stderr */        if (nochdir == 0)        chdir("/");           /* change working directory */        if (noclose == 0) {        /*close off file descriptors*/        for (i = 0; i < MAXFD; i++)            close(i);            /* redirect stdin, stdout, and stderr to /dev/null */        open("/dev/null", O_RDONLY);        open("/dev/null", O_RDWR);            open("/dev/null", O_RDWR);    }    umask(0);}

 

運行截圖:

image

 

 

 

 

參考資料:

《UNIX網絡編程 卷1:套接字聯網API(第3版)》

linux系統編程之進程(八):守護進程詳解及創建,daemon()使用Linux內核中的進程組及會話
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91av视频在线| 成人午夜激情免费视频| 成人黄色大片在线免费观看| 欧美精品在线看| 欧美极品在线播放| 国产成人免费91av在线| 欧美日韩中文在线| 一区二区在线免费视频| 亚洲人成电影在线观看天堂色| 久久久久女教师免费一区| 国产精品久久久| 欧美电影院免费观看| 亚洲毛片在线看| 久久久精品视频成人| 中文日韩在线观看| 国产亚洲精品久久久久久牛牛| 啪一啪鲁一鲁2019在线视频| 日韩精品在线视频| 国产在线视频一区| 久久av.com| 国产成人在线精品| 97超级碰碰人国产在线观看| 国产精品亚洲视频在线观看| 亚洲欧美制服第一页| 亚洲影院色无极综合| 欧美黑人国产人伦爽爽爽| 精品国产一区二区三区四区在线观看| 国产99在线|中文| 国产精品自拍网| 国产综合久久久久| 国产成人极品视频| 综合网日日天干夜夜久久| 国产精品成人免费电影| 国产精品日韩欧美综合| 国产不卡视频在线| 亚洲最大福利视频网| 精品在线小视频| 91亚洲午夜在线| 国产精品久久久久999| 成人久久18免费网站图片| 欧美激情乱人伦| 国产精品免费久久久久影院| 午夜剧场成人观在线视频免费观看| 中文字幕日韩av综合精品| 日韩美女在线看| 日韩欧美中文在线| 粗暴蹂躏中文一区二区三区| 最近2019中文字幕mv免费看| 91久久久久久久久久久| 欧美日韩亚洲视频| 国产精品免费一区二区三区都可以| 91九色视频导航| 国产精品久久久久久婷婷天堂| 国产精品嫩草视频| 亚洲天堂网站在线观看视频| 孩xxxx性bbbb欧美| 国产福利视频一区二区| 狠狠色噜噜狠狠狠狠97| 日韩成人黄色av| 精品av在线播放| 最近2019年日本中文免费字幕| 精品色蜜蜜精品视频在线观看| 国产精品第3页| 日韩成人中文电影| 欧美色视频日本高清在线观看| 久久躁狠狠躁夜夜爽| 91精品国产91久久久久久不卡| 91精品免费久久久久久久久| 欧美一级bbbbb性bbbb喷潮片| 国产亚洲一区精品| 亚洲自拍偷拍区| 97久久伊人激情网| 亚洲国产精品一区二区三区| 欧美精品午夜视频| 国产福利精品视频| 精品欧美一区二区三区| 日产精品99久久久久久| 26uuu日韩精品一区二区| 中文字幕精品在线| 久久精品99久久久香蕉| 亚洲最大成人免费视频| 成人福利在线视频| 国产亚洲精品久久久| 91久久在线观看| 日韩欧美在线一区| 日韩精品中文在线观看| 亚洲毛茸茸少妇高潮呻吟| 日韩欧美国产激情| 91精品久久久久久久久久入口| 欧美日韩福利电影| 日韩欧美中文在线| 国产一区二区三区久久精品| 7777精品久久久久久| 久久福利视频网| 亚洲免费电影一区| 欧美日韩成人在线观看| 久久亚洲成人精品| 97免费在线视频| 成人午夜激情免费视频| 亚洲激情国产精品| 成人精品久久av网站| 久久久精品在线| 日韩美女av在线免费观看| 日韩中文字幕在线视频| 成人网址在线观看| 欧美日韩午夜剧场| 欧美激情视频在线免费观看 欧美视频免费一| 88国产精品欧美一区二区三区| 亚洲一级黄色片| 91久久国产精品91久久性色| 亚洲一区二区三区四区视频| 国产亚洲精品高潮| 日韩av在线影视| 日韩中文字幕在线| 97在线视频精品| 久久亚洲精品一区二区| 欧美电影免费观看网站| 在线观看不卡av| 欧美疯狂xxxx大交乱88av| 国产精品v日韩精品| 国产丝袜精品视频| 亚洲精品在线不卡| 欧美电影免费观看电视剧大全| 欧美成人精品影院| 亚洲色在线视频| 国产精品久久久久久久久久99| 久久久免费精品视频| 亚洲视频电影图片偷拍一区| 欧美激情aaaa| 欧美电影在线免费观看网站| 黑人精品xxx一区一二区| 日韩精品中文字幕视频在线| 美女国内精品自产拍在线播放| 国产精品久久在线观看| 成人黄色在线免费| 国产91精品不卡视频| 久久精品视频99| 欧美成人全部免费| 国产视频在线一区二区| 国产精品成人观看视频国产奇米| 国产在线精品成人一区二区三区| 日韩视频免费在线| 久久香蕉精品香蕉| 日本19禁啪啪免费观看www| 精品国产美女在线| 上原亚衣av一区二区三区| 国产日本欧美在线观看| 日韩在线观看免费高清| 国产欧美亚洲精品| 久久久精品亚洲| 91高清在线免费观看| 国产精品综合久久久| 在线国产精品视频| 精品久久久久久中文字幕大豆网| 欧美日韩在线视频观看| 日韩国产高清污视频在线观看| 91久久国产婷婷一区二区| 欧美午夜片欧美片在线观看| 欧美精品免费看| 精品毛片三在线观看| 国产精品mp4| 在线观看国产精品91| 久久精品国产久精国产一老狼| 国产日韩综合一区二区性色av|