守護程序是一種生命週期很長的程序。它在後台長期執行,並且沒有控制終端。
清除程序的umask,從而確保守護程序有足夠的許可權來建立檔案和目錄。
umask(0
);
int pid =
fork()
;if(pid >0)
exit(0
);
有兩個原因需要我們這樣做。首先,如果daemon程序是通過shell命令啟動的,當我們退出父程序時,shell會認為命令已經執行完了,從而使得子程序繼續在後台執行;其次,確保了子程序不會成為乙個程序組的首程序(因為子程序的程序組id是從父程序**繼承而來的,和子程序的程序id不同,而程序組首程序的必要條件就是程序組id和程序id相同),這是接下來使用setsid的先決條件。
呼叫setsid建立乙個新會話,由於呼叫該函式的程序不是乙個程序組的首程序,因此會發生以下3件事:
setsid()
;
chdir
("/"
);
int maxfd =
sysconf
(_sc_open_max)
;for
(int fd =
0; fd < maxfd; fd++
)
這樣做是為了使得daemon程序在這些檔案描述符上指向i/o的庫函式時不會失敗。同時防止了daemon程序使用這些描述符開啟乙個檔案的情況。
int fd0 =
open
("/dev/null"
, o_rdwr);if
(fd0 !=0)
return-1
;dup2(0
,1);
dup2(0
,2);
linux提供了乙個daemon函式,能夠使得呼叫該函式的程序變為daemon程序。
#include
intdaemon
(int nochdir,
int noclose)
;// nochdir指定是否改變工作目錄,為0時表示工作目錄為根目錄
// noclose為0時,檔案描述符0,1,2都被重定向到/dev/null檔案。否則仍然使用原來的裝置
// 函式成功返回0,失敗返回-1
daemon守護程序
daemon守護程序 守護程序是乙個後台程序,不能夠控制終端,所以任何輸出,無論是向標準出錯裝置stderr還是向標準輸出裝置stdout的輸出都需做特別處理。守護程序一般在系統啟動時啟動,它的父程序是init程序。建立守護程序 1在父程序執行fork然後讓父程序退出。2在子程序中使用setsid呼...
守護程序 daemon
守護程序常常在系統引導裝入時啟動,在系統關閉時終止。一般說daemon程式在後台執行,是因為它沒有控制終端,無法和前台的使用者互動。daemon程式一般都作為服務程式使用,等待客戶端程式與它通訊。我們也把執行的daemon程式稱作守護程序。乙個守護程序的父程序是init程序,因為它真正的父程序在fo...
守護程序(Daemon)
守護程序 daemon 一般是為了保護我們的程式 服務的正常執行,當程式被關閉 異常退出等時再次啟動程式 恢復服務。例如 http 服務的守護程序叫 httpd,mysql 服務的守護程序叫 mysqld。或者有時候我們需要讓我們的程式 服務能不中斷地執行,在關閉終端後也能在後台默默執行,除了可以這...