守護程序(daemon)一般是為了保護我們的程式/服務的正常執行,當程式被關閉、異常退出等時再次啟動程式/恢復服務。
例如 http 服務的守護程序叫 httpd,mysql 服務的守護程序叫 mysqld。
或者有時候我們需要讓我們的程式/服務能不中斷地執行,在關閉終端後也能在後台默默執行,除了可以這樣:
nohup ./*** &
,也可以寫成 daemon 程式,例如乙個伺服器。
許多伺服器程序就是寫成了 daemon 程式,例如 nginx、redis、apache 等。
linux 中一般把守護程序放在/etc/init.d/
中,啟動服務時的命令一般是/etc/init.d/*
。
守護程序脫離終端而存在。當你執行命令ps -ef
時,守護程序的 ppid (父程序 id)都是 1,tty (終端)則是???
。
linix 中可以呼叫int daemon(int nochdir, int noclose);
函式來使程式成為乙個守護程序。具體用法可以用「男人」命令(手冊命令)查詢:man daemon
。
通過原理我們也可以手動建立乙個守護程序。
守護程序的父程序是 init 程序,在建立時先從父程序 fork 出來乙個子程序,退出父程序,這時子程序變成孤兒,就成了 init 的子程序。
子程序會繼承父程序的會話,程序組,控制終端,檔案描述符等。
通過setid()
來建立新會話,同時也脫離了原來的程序組,會話以及控制終端,成為新的會話的組長。此時它可能會再申請乙個控制終端,所以我們再 fork 一下,並只保留新的子程序,這樣就不是會話組長了,就不能申請控制終端了。
之後再關閉從父程序繼承的檔案描述符。至少要關閉 0,1,2 這三個檔案描述符,分別對應了 stdin, stdout, 和 stderr。不過通常用sysconf(_sc_open_max)
獲取系統允許的最大檔案描述符個數,然後全部 close 掉。
關閉之後我們要將檔案描述符 0,1,2 重新定向到 "/dev/null",防止新開啟的檔案的檔案描述符為 0,1,2。
設定檔案掩碼是為了不受父程序的 umask 的影響,能自由建立讀寫檔案和目錄。
守護程序一般是一直執行到系統關機,在它執行過程中,它所在的目錄就不能解除安裝(unmounted)。通過將它的工作目錄轉移到根目錄,用來的目錄就允許解除安裝了。也不一定要根目錄(這種情況,執行需要超級許可權),可以選擇乙個不需要解除安裝的路徑。
void daemon()
// 退出父程序。
if(pid)
// 建立新會話。
// 該子程序會成為新的會話和程序組的組長。
if(setsid() == -1)
// 再 fork 一次,新的子程序不再是會話組長。
pid = fork();
if( pid == -1)
if(pid)
// 關掉從父程序繼承的檔案描述符。
int max_fd = sysconf(_sc_open_max);
for(int i = 0; i < max_fd; ++i)
// 重定向檔案描述符 0, 1, 2 到 /dev/null
open("/dev/null", o_rdwr);
dup(0);
dup(0);
// 設定檔案建立許可權掩碼,不希望被父程序的掩碼限制。
umask(0);
// 將當前工作目錄設定為系統根目錄。
chdir("/");
}
daemon守護程序
daemon守護程序 守護程序是乙個後台程序,不能夠控制終端,所以任何輸出,無論是向標準出錯裝置stderr還是向標準輸出裝置stdout的輸出都需做特別處理。守護程序一般在系統啟動時啟動,它的父程序是init程序。建立守護程序 1在父程序執行fork然後讓父程序退出。2在子程序中使用setsid呼...
守護程序 daemon
守護程序常常在系統引導裝入時啟動,在系統關閉時終止。一般說daemon程式在後台執行,是因為它沒有控制終端,無法和前台的使用者互動。daemon程式一般都作為服務程式使用,等待客戶端程式與它通訊。我們也把執行的daemon程式稱作守護程序。乙個守護程序的父程序是init程序,因為它真正的父程序在fo...
守護程序Daemon
是linux的後台服務程序。它是乙個生存週期較長的程序,沒有控制終端,輸出無處顯示。使用者層守護程序的父程序是init程序。守護程序建立步驟 1 建立子程序,父程序退出,子程序被init自動收養 fork exit 2 呼叫setsid建立新會話,成為新會話的首程序,成為新程序組的組長程序,擺脫父程...