IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當前所在位置: 首頁操作系統(tǒng)LINUX → linux守護進程daemon

linux守護進程daemon

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)

  Daemon程序簡介

  Daemon是長時間運行的進程,通常在系統(tǒng)啟動后就運行,在系統(tǒng)關(guān)閉時才結(jié)束。一般說Daemon程序在后臺運行,是因為它沒有控制終端,無法和前臺的用戶交互。Daemon程序一般都作為服務(wù)程序使用,等待客戶端程序與它通信。我們也把運行的Daemon程序稱作守護進程。

  比如,我們的網(wǎng)絡(luò)服務(wù)程序,可以在完成創(chuàng)建套接口,綁定套接口,設(shè)置套接口為監(jiān)聽模式后,變成守護進程進入后臺執(zhí)行而不占用控制終端,這是網(wǎng)絡(luò)服務(wù)程序的常用模式。UNIX下的網(wǎng)絡(luò)服務(wù)程序,如Web  Server,F(xiàn)TP,Telnet一般都是由守護進程(Daemon)來實現(xiàn)的。守護進程不占用終端,在后臺運行。UNIX的守護進程一般都命名為  *d 的形式,如httpd,telnetd等等。

  守護進程一旦脫離了終端,退出就成了問題。使用 ps axj 查出進程ID然后 kill ID 之。

  Daemon程序編寫規(guī)則

  編寫Daemon程序有一些基本的規(guī)則,以避免不必要的麻煩。

  1、首先是程序運行后調(diào)用fork,并讓父進程退出。子進程獲得一個新的進程ID,但繼承了父進程的進程組ID。

  2、調(diào)用setsid創(chuàng)建一個新的session,使自己成為新session和新進程組的leader,并使進程沒有控制終端(tty)。

  3、改變當前工作目錄至根目錄,以免影響可加載文件系統(tǒng)?;蛘咭部梢愿淖兊侥承┨囟ǖ哪夸?。

  4、設(shè)置文件創(chuàng)建mask為0,避免創(chuàng)建文件時權(quán)限的影響。

  5、關(guān)閉不需要的打開文件描述符。因為Daemon程序在后臺執(zhí)行,不需要于終端交互,通常就關(guān)閉STDIN、STDOUT和STDERR。其它根據(jù)實際情況處理。另一個問題是Daemon程序不能和終端交互,也就無法使用printf方法輸出信息了。

  另一個問題是Daemon程序不能和終端交互,也就無法使用printf方法輸出信息了。我們可以使用syslog機制來實現(xiàn)信息的輸出,方便程序的調(diào)試。

  下面是一個daemon程序的例子:(daemontest.c)

  view plaincopy to clipboardprint?

  1. #include

  2. #include

  3. #include

  4. #include

  5. #include

  6. #include

  7. #include

  8. int daemon_init(void)

  9. {

  10.???? pid_t pid;

  11.?? if((pid = fork()) < 0)

  12.???? return(-1);

  13.?? else if(pid != 0)

  14.???? exit(0); /* parent exit */

  15.?? /* child continues */

  16.?? setsid(); /* become session leader */

  17.?? chdir("/"); /* change working directory */

  18.?? umask(0); /* clear file mode creation mask */

  19.?? close(0); /* close stdin */

  20.?? close(1); /* close stdout */

  21.?? close(2); /* close stderr */

  22.?? return(0);

  23. }

  24.

  25. void sig_term(int signo)

  26. {

  27.???? if(signo == SIGTERM)

  28. /* catched signal sent by kill(1) command */

  29.?? {

  30.???? syslog(LOG_INFO, "program terminated.");

  31.?? closelog();

  32.?? exit(0);

  33.?? }

  34. }

  35.

  36. int main(void)

  37. {

  38.???? if(daemon_init() == -1)

  39.?? {

  40.???? printf("can't fork self\n");

  41.???? exit(0);

  42.?? }

  43.?? openlog("daemontest", LOG_PID, LOG_USER);

  44.?? syslog(LOG_INFO, "program started.");

  45.?? signal(SIGTERM, sig_term); /* arrange to catch the signal */

  46.?? while(1)

  47.?? {

  48.???? sleep(1); /* put your main program here */

  49.?? }

  50.?? return(0);

  51. }

  使用如下命令編譯該程序: gcc -Wall -o daemontest daemontest.c編譯完成后生成名為daemontest的可執(zhí)行程序,執(zhí)行./daemontest來測試程序的運行。

  使用ps axj命令可以顯示系統(tǒng)中已運行的daemon程序的信息,包括進程ID、session ID、控制終端等內(nèi)容。部分顯示內(nèi)容:

  PPID?? PID? PGID?? SID TTY????? TPGID STAT?? UID?? TIME COMMAND

  1 17765 17765 17765 ????? -1 Ss 0?? 0:00 ./daemontest

  從中可以看到daemontest程序運行的進程號為17765。

  我們再來看看/var/log/messages文件中的信息:

  Feb? 3 17:09:30 localhost daemontest[17765]: program started.

  顯示了我們在程序中希望輸出的信息。

  使用kill 17765命令來殺死這個進程,/var/log/messages文件中就會有如下的信息:

  Feb? 3 17:12:26 localhost daemontest[17765]: program terminated.

  再使用ps axj命令檢查,發(fā)現(xiàn)系統(tǒng)中daemontest進程已經(jīng)沒有了。

關(guān)鍵詞標簽:linux,daemon

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP Linux操作系統(tǒng)修改IP

相關(guān)下載

    人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內(nèi)存型號 linux tc實現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機、重啟、注銷 命令 查看linux服務(wù)器硬盤IO讀寫負載