2011-03-21 10 views
64

我想知道我怎樣才能讓我的程序daemon.So我遇到一些事情是一般情況下,程序執行以下步驟成爲守護程序:如何製作工藝守護

  1. 致電fork()
  2. 在母公司中,請致電exit()。這可以確保原始父節點(守護進程的祖父節點 )確信其子節點已終止,守護進程的父節點不再運行 ,並且該守護進程不是進程組組長。最後一點 是成功完成下一步的要求。

  3. 呼叫setsid(),給人守護一個新的進程組和會話,兩者的 它有它的領導者。這也確保該過程沒有關聯的控制終端 (因爲該過程剛剛創建了新的會話,並且將不分配 之一)。

  4. 通過chdir()將工作目錄更改爲根目錄。這是因爲繼承的工作目錄可以位於文件系統的任何位置,因此完成 。 守護程序傾向於在系統正常運行時間期間運行,並且您不希望 保持某個隨機目錄處於打開狀態,從而阻止管理員從 卸載包含該目錄的文件系統。

  5. 關閉所有文件描述符。

  6. 打開文件描述符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某些程序的現有的源代碼,這樣我可以理解更深入了這個過程。

+2

你可以得到Apache的源代碼[here](http://httpd.apache.org/download.cgi)。 – nmichaels 2011-03-21 21:51:35

+7

也許[守護進程(3)](http://linux.die.net/man/3/daemon)可能會有所幫助。它基本上說,所需的功能已經實現。 – Vlad 2011-03-21 21:53:24

+0

@nmichaels感謝您的消息,實際上我正在尋找那些使它成爲守護進程的行.Apache不是專門的。因此,如果某些在線將比下載整個源容易。 – 2011-03-21 21:53:43

回答

13

如果您正在尋找乾淨的方法,請考慮使用標準api- int daemon(int nochdir, int noclose);。手冊頁非常簡單和自我解釋。 man page。經過充分測試的api遠遠超過了我們自己的可移植性和穩定性的實現。

+0

我很高興,這是一個*答案*現在,而不是隱藏在註釋。也許你可以充實一點 - 鏈接到標準(甚至更好,指向教程或示例的鏈接)。 – RJHunter 2016-05-22 10:34:53

+2

@deadbeef這個答案是比平原[_link only_答案](http://meta.stackoverflow.com/questions/323508/what-to-do-with-broken-but-highly-upvoted-link-only好得多 - 之前出現過的)。但是,它也非常接近_link(無論如何,我會考慮給定的鏈接更穩定)。我會嘗試增強答案,給出一個簡短的代碼示例(尤其是因爲在鏈接手冊頁中沒有),或者引用大綱。 – 2016-05-23 17:33:59

+2

注意,[守護進程(http://man7.org/linux/man-pages/man3/daemon.3.html)函數是不** ** POSIX標準。 – 2016-08-07 09:56:46

0

在Linux中,它可以很容易地使用。

main() 
{ 

daemon(0,0); 
while(1) 
{ 
sleep(10) 
/*do something*/ 
} 

}