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