守護程序 daemon

2021-10-19 17:54:45 字數 1223 閱讀 2628

守護程序是一種生命週期很長的程序。它在後台長期執行,並且沒有控制終端。

清除程序的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。或者有時候我們需要讓我們的程式 服務能不中斷地執行,在關閉終端後也能在後台默默執行,除了可以這...