守護程序(Daemon)

2021-09-07 17:52:23 字數 1842 閱讀 1962

守護程序(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建立新會話,成為新會話的首程序,成為新程序組的組長程序,擺脫父程...