我想知道我怎樣才能讓我的程序daemon.So我遇到一些事情是一般情況下,程序執行以下步驟成爲守護程序:如何製作工藝守護
- 致電
fork()
。 在母公司中,請致電
exit()
。這可以確保原始父節點(守護進程的祖父節點 )確信其子節點已終止,守護進程的父節點不再運行 ,並且該守護進程不是進程組組長。最後一點 是成功完成下一步的要求。呼叫
setsid()
,給人守護一個新的進程組和會話,兩者的 它有它的領導者。這也確保該過程沒有關聯的控制終端 (因爲該過程剛剛創建了新的會話,並且將不分配 之一)。通過
chdir()
將工作目錄更改爲根目錄。這是因爲繼承的工作目錄可以位於文件系統的任何位置,因此完成 。 守護程序傾向於在系統正常運行時間期間運行,並且您不希望 保持某個隨機目錄處於打開狀態,從而阻止管理員從 卸載包含該目錄的文件系統。關閉所有文件描述符。
- 打開文件描述符0,1和2(標準輸入,標準輸出和標準錯誤) 並將它們重定向到
/dev/null
。
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>
int main (void)
{
pid_t pid;
int i;
/* create new process */
pid = fork ();
if (pid == -1)
return -1;
else if (pid != 0)
exit (EXIT_SUCCESS);
/* create new session and process group */
if (setsid () == -1)
return -1;
/* set the working directory to the root directory */
if (chdir ("/") == -1)
return -1;
/* close all open files--NR_OPEN is overkill, but works */
for (i = 0; i < NR_OPEN; i++)
close (i);
/* redirect fd's 0,1,2 to /dev/null */
open ("/dev/null", O_RDWR);
/* stdin */
dup (0);
/* stdout */
dup (0);
/* stderror */
/* do its daemon thing... */
return 0;
}
有人能給我一個鏈接,如Apache某些程序的現有的源代碼,這樣我可以理解更深入了這個過程。
你可以得到Apache的源代碼[here](http://httpd.apache.org/download.cgi)。 – nmichaels 2011-03-21 21:51:35
也許[守護進程(3)](http://linux.die.net/man/3/daemon)可能會有所幫助。它基本上說,所需的功能已經實現。 – Vlad 2011-03-21 21:53:24
@nmichaels感謝您的消息,實際上我正在尋找那些使它成爲守護進程的行.Apache不是專門的。因此,如果某些在線將比下載整個源容易。 – 2011-03-21 21:53:43