守护进程

守护进程

为何须要守护进程呢? 普通进程在运行时能够被控制终端发出的信号打断, 而守护进程因为脱离了控制终端, 因此不会被其打断.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了.

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息