当前位置: 首页 > 后端技术 > PHP

守护进程

时间:2023-03-30 00:22:48 PHP

为什么守护进程需要守护进程?普通进程在运行时可以被控制端发出的信号打断,但守护进程不会被打断,因为它与控制端是分开的。创建守护进程的标准进程调用umask来设置文件创建的掩码。fork子进程并关闭父进程。调用posix_setsid创建一个新会话。将当前工作目录切换到根目录。不需要的文件描述符全部关闭。标准的输入输出错误重定向除了第2步和第3步,其他其实都是可选的。守护进程PHP代码函数daemon(){umask(0);$pid=pcntl_fork();如果($pid>0){退出(0);}elseif($pid<0){printf("分叉失败");}posix_setsid();$pid=pcntl_fork();如果($pid>0){退出(0);}elseif($pid<0){printf("分叉失败");}}要把一个进程变成守护进程,首先要让进程脱离当前的控制终端。为了实现这个目标,我们需要调用posix_setsid。但是为什么我们的代码在调用posix_setsid之前需要fork一次呢?这是因为调用posix_setsid的进程不能是会话领导者。为了保险起见,首先会fork出一个子进程,而且fork出来的子进程一定不能是sessionleader。那为什么调用完posix_setsid还要再次fork呢?其实这个不一定是必须的,nginx在实现daemon的时候不会fork两次。许多守护进程实现不会分叉两次。只是有人建议在sysv系统上再次fork,这样可以防止daemon打开控制终端,因为再次fork后,子进程就不是sessionleader了。