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

您當(dāng)前所在位置: 首頁(yè)操作系統(tǒng)LINUX → linux守護(hù)進(jìn)程daemon

linux守護(hù)進(jìn)程daemon

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

  Daemon程序簡(jiǎn)介

  Daemon是長(zhǎng)時(shí)間運(yùn)行的進(jìn)程,通常在系統(tǒng)啟動(dòng)后就運(yùn)行,在系統(tǒng)關(guān)閉時(shí)才結(jié)束。一般說(shuō)Daemon程序在后臺(tái)運(yùn)行,是因?yàn)樗鼪](méi)有控制終端,無(wú)法和前臺(tái)的用戶交互。Daemon程序一般都作為服務(wù)程序使用,等待客戶端程序與它通信。我們也把運(yùn)行的Daemon程序稱(chēng)作守護(hù)進(jìn)程。

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

  守護(hù)進(jìn)程一旦脫離了終端,退出就成了問(wèn)題。使用 ps axj 查出進(jìn)程ID然后 kill ID 之。

  Daemon程序編寫(xiě)規(guī)則

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

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

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

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

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

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

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

  下面是一個(gè)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來(lái)測(cè)試程序的運(yùn)行。

  使用ps axj命令可以顯示系統(tǒng)中已運(yùn)行的daemon程序的信息,包括進(jìn)程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程序運(yùn)行的進(jìn)程號(hào)為17765。

  我們?cè)賮?lái)看看/var/log/messages文件中的信息:

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

  顯示了我們?cè)诔绦蛑邢M敵龅男畔ⅰ?/p>

  使用kill 17765命令來(lái)殺死這個(gè)進(jìn)程,/var/log/messages文件中就會(huì)有如下的信息:

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

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

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

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門(mén)文章 安裝紅帽子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、硬盤(pán)序列號(hào)與MAC地址 dmidecode命令查看內(nèi)存型號(hào) linux tc實(shí)現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機(jī)、重啟、注銷(xiāo) 命令 查看linux服務(wù)器硬盤(pán)IO讀寫(xiě)負(fù)載