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