Linux 建立守護程序(daemon)

2021-07-27 11:05:48 字數 2473 閱讀 4643

要變成daemon,乙個程式需要完成下面的步驟:

執行乙個fork(),之後父程序退出,子程序繼續執行。(結果就是daemon成為了init程序的子程序。)之所以要做這一步是因為下面兩個原因:

子程序呼叫setsid()開啟乙個新回話並釋放它與控制終端之間的所有關聯關係。

如果daemon從來沒有開啟過終端裝置,那麼就無需擔心daemon會重新請求乙個控制終端了。如果daemon後面可能會開啟乙個終端裝置,那麼必須要採取措施來確保這個裝置不會成為控制終端。這可以通過下面兩種方式實現:

清除程序的umask以確保當daemon建立檔案和目錄時擁有所需的許可權。修改程序的當前工作目錄,通常會改為根目錄(/)。這樣做是有必要的,因為daemon通常會一直執行直至系統關閉為止。如果daemon的當前工作目錄為不包含/的檔案系統,那麼就無法解除安裝該檔案系統。或者daemon可以將工作目錄改為完成任務時所在的目錄或在配置檔案中定義乙個目錄,只要包含這個目錄的檔案系統永遠不會被解除安裝即可。

關閉daemon從其父程序繼承而來的所有開啟著的檔案描述符。(daemon可能需要保持繼承而來的檔案描述的開啟狀態,因此這一步是可選的或者可變更的。)之所以這樣做的原因有很多。由於daemon失去了控制終端並且是在後台執行的,因此讓daemon保持檔案描述符0、1和2的開啟狀態毫無意義,因為它們指向的就是控制終端。此外,無法解除安裝長時間執行的daemon開啟的檔案所在的檔案系統。因此,通常的做法是關閉所有無用的開啟著的檔案描述符,因為檔案描述符是一種有限的資源。

在關閉了檔案描述符0、1和2之後,daemon通常會開啟/dev/null並使用dup2()(或類似的函式)使所有這些描述符指向這個裝置。之所以要這樣做是因為下面兩個原因:

#include 

#include

#include

#include

#include

#include

bool start_daemon()

/*pid_t setsid(void);

程序呼叫setsid()可建立乙個新對話期間。

如果呼叫此函式的程序不是乙個程序組的組長,則此函式建立乙個新對話期,結果為:

1、此程序變成該新對話期的對話期首程序(session leader,對話期首程序是建立該對話期的程序)。

此程序是該新對話期中的唯一程序。

2、此程序成為乙個新程序組的組長程序。新程序組id就是呼叫程序的程序id。

3、此程序沒有控制終端。如果在呼叫setsid之前次程序有乙個控制終端,那麼這種聯絡也被解除。

如果呼叫程序已經是乙個程序組的組長,則此函式返回錯誤。為了保證不處於這種情況,通常先呼叫fork(),

然後使其父程序終止,而子程序繼續執行。因為子程序繼承了父程序的程序組id,而子程序的程序id則是新

分配的,兩者不可能相等,所以這就保證了子程序不是乙個程序組的組長。

*/if (setsid() == -1)

switch (fork())

umask(0);

chdir("/");

long maxfd;

if ((maxfd = sysconf(_sc_open_max)) != -1)

}fd = open("/dev/null", o_rdwr);

if (fd == -1)

/*// standard file descriptors.

#define stdin_fileno 0 // standard input.

#define stdout_fileno 1 // standard output.

#define stderr_fileno 2 // standard error output.

*//* int dup2(int oldfd, int newfd);

dup2()用來複製引數oldfd所指的檔案描述符,並將它拷貝至引數newfd後一塊返回。

如果newfd已經開啟,則先將其關閉。

如果oldfd為非法描述符,dup2()返回錯誤,並且newfd不會被關閉。

如果oldfd為合法描述符,並且newfd與oldfd相等,則dup2()不做任何事,直接返回newfd。

*/if (dup2(fd, stdin_fileno) == -1)

if (dup2(fd, stdout_fileno) == -1)

if (dup2(fd, stderr_fileno) == -1)

if (fd > stderr_fileno)

}return

true;

}int main(int argc, char** argv)

return

0;}

《linux_unix系統程式設計手冊》

《unix環境高階程式設計》

Linux 守護程序建立

守護程序是在後台執行,不受使用者的控制 守護程序沒有任何存在的父程序。如果乙個程序想成為守護程序,有fork 建立 然後終止父程序,脫離資源。例子 void init daemon int pid,i pid fork if pid exit 0 結束父程序 else exit 1 失敗退出 是子程...

linux 守護程序詳解及建立守護程序

linux 守護程序詳解及建立守護程序 守護程序是一種後台執行並且獨立於所有終端控制之外的程序。守護程序的啟動 要啟動乙個守護程序,可以採取一下幾種方式 守護程序的建立 先來看乙個守護程序建立的例子 include include include include define maxfd 64 vo...

linux守護程序的建立

下面的完成了這樣乙個功能,建立乙個守護程序,每個一秒在 tmp目錄下的檔案peng.txt中記錄當前系統時間。一 守護程序 守護程序是linux中的後台服務程序,在系統啟動時開始執行,在系統關閉時終止。linux系統中的大多數服務程序都是由守護程序實現的。二 建立守護程序 此時,子程序變成孤兒程序,...