爲何須要守護進程呢? 普通進程在運行時能夠被控制終端發出的信號打斷, 而守護進程因爲脫離了控制終端, 因此不會被其打斷.php
調用umask設置文件建立的掩碼nginx
fork子進程並關閉父進程session
調用posix_setsid建立新會話code
把當前工做目錄切換爲根目錄進程
不須要的文件描述符所有關閉it
標準輸入輸出錯誤重定向io
除了第2步和第3步,其它的其實都是可選的.function
function daemon() { umask(0); $pid = pcntl_fork(); if ($pid > 0) { exit(0); } elseif ($pid < 0) { printf("fork failed"); } posix_setsid(); $pid = pcntl_fork(); if ($pid > 0) { exit(0); } elseif ($pid < 0) { printf("fork failed"); } }
把一個進程變成守護進程, 首先要讓該進程脫離當前的控制終端, 要達到這個目的須要調用posix_setsid
.class
但咱們的代碼爲何在調用posix_setsid
以前要fork
一次呢? 這是由於調用posix_setsid
的進程必須不能是session leader
, 爲了確保萬無一失, 會先fork
一個子進程, fork
出來的子進程就必然不是session leader
了. 終端
那在調用posix_setsid
以後爲何還要再fork
一次呢? 其實這必不是必須的, nginx
在實現daemon
時就沒有fork
兩次.
不少daemon
的實現都沒有fork
兩次. 只是有人推薦在sysv system
上, 再fork
一次, 能夠避免守護進程打開控制終端, 由於再fork
一次以後, 子進程就不是session leader
了.