時間: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)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 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讀寫負載