守護進程

守護進程

爲何須要守護進程呢? 普通進程在運行時能夠被控制終端發出的信號打斷, 而守護進程因爲脫離了控制終端, 因此不會被其打斷.php

守護進程建立的標準流程

  • 調用umask設置文件建立的掩碼nginx

  • fork子進程並關閉父進程session

  • 調用posix_setsid建立新會話code

  • 把當前工做目錄切換爲根目錄進程

  • 不須要的文件描述符所有關閉it

  • 標準輸入輸出錯誤重定向io

除了第2步和第3步,其它的其實都是可選的.function

守護進程PHP代碼

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了.

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息