這又是一個有趣的概念,daemon在英語中是"精靈"的意思,就像咱們常常在迪斯尼動畫裏見到的那些,有些會飛,有些不會,常常圍着動畫片的主人公轉來轉去,囉裏囉唆地提一些忠告,時不時倒黴地撞在柱子上,有時候還會想出一些小小的花招,把主人公從敵人手中救出來,正因如此,daemon有時也被譯做"守護神"。因此,daemon進程在國內也有兩種譯法,有些人譯做"精靈進程",有些人譯做"守護進程",這兩種稱呼的出現頻率都很高。shell
與真正的daemon類似,daemon進程也習慣於把本身隱藏在人們的視線以外,默默爲系統作出貢獻,有時人們也把它們稱做"後臺服務進程"。daemon進程的壽命很長,通常來講,從它們一被執行開始,直到整個系統關閉,它們纔會退出。幾乎全部的服務器程序,包括咱們熟知的Apache和wu-FTP,都用daemon進程的形式實現。不少Linux下常見的命令如inetd和ftpd,末尾的字母d就是指daemon。服務器
爲何必定要使用daemon進程呢?Linux中每個系統與用戶進行交流的界面稱爲終端(terminal),每個今後終端開始運行的進程都會依附於這個終端,這個終端就稱爲這些進程的控制終端(Controlling terminal),當控制終端被關閉時,相應的進程都會被自動關閉。關於這點,讀者能夠用X-Window中的XTerm試驗一下,(每個XTerm就是一個打開的終端,)咱們能夠經過鍵入命令啓動應用程序,好比:session
$netscape動畫
而後咱們關閉XTerm窗口,剛剛啓動的netscape窗口也會隨之一同忽然蒸發。可是daemon進程卻可以突破這種限制,即便對應的終端關閉,它也能在系統中長久地存在下去,若是咱們想讓某個進程長命百歲,不由於用戶或終端或其餘的變化而受到影響,就必須把這個進程變成一個daemon進程。命令行
若是想把本身的進程變成daemon進程,咱們必須嚴格按照如下步驟進行:繼承
下面,就然咱們親眼看一個daemon進程的誕生:進程
/* daemon.c */資源
#include<unistd.h>terminal
#include<sys/types.h>it
#include <sys/stat.h>
#define MAXFILE 65535
main()
{
pid_t pid; int i;
pid=fork();
if(pid<0)
{
printf("error in fork\n");
exit(1);
}
else if(pid>0)
/* 父進程退出 */
exit(0);
/* 調用setsid */
setsid();
/* 切換當前目錄 */
chdir("/");
/* 設置文件權限掩碼 */
umask(0);
/* 關閉全部可能打開的不須要的文件 */
for(i=0;i<MAXFILE;i++)
close(i);
/*到如今爲止,進程已經成爲一個徹底的daemon進程,你能夠在這裏添加任何你要daemon作的事情*/
for(;;)
sleep(10);
}