资讯专栏INFORMATION COLUMN

守护进程

Carbs / 381人阅读

摘要:守护进程为什么需要守护进程呢普通进程在运行时可以被控制终端发出的信号打断而守护进程由于脱离了控制终端所以不会被其打断守护进程创建的标准流程调用设置文件创建的掩码子进程并关闭父进程调用创建新会话把当前工作目录切换为根目录不需要的文件描述符全部

守护进程

为什么需要守护进程呢? 普通进程在运行时可以被控制终端发出的信号打断, 而守护进程由于脱离了控制终端, 所以不会被其打断.

守护进程创建的标准流程

调用umask设置文件创建的掩码

fork子进程并关闭父进程

调用posix_setsid创建新会话

把当前工作目录切换为根目录

不需要的文件描述符全部关闭

标准输入输出错误重定向

除了第2步和第3步,其它的其实都是可选的.

守护进程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.

但我们的代码为什么在调用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了.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22557.html

相关文章

  • Docker命令行与守护进程如何交互?

    摘要:命令行是与守护进程进行交互的主要工具。感兴趣的话,你也可以开发一个,使用与守护进程进行交互就好了。命令行与守护进程如何交互从左至右理解上图最左侧是客户端,即命令行。而在与上运行时,守护进程事实上运行在虚拟机中。 译者按: Docker是典型的C/S架构,其守护进程(daemon)与命令行(CLI)是通过REST API进行交互的。 原文: Understanding how the D...

    willin 评论0 收藏0
  • 一起学并发编程 - 守护线程

    摘要:的作用是为其他线程的运行提供服务,比如说线程。在某些平台上,指定一个较高的参数值可能使线程在抛出之前达到较大的递归深度。参数的值与最大递归深度和并发程度之间的关系细节与平台有关。 今天研究了下Java线程基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程),以及构造器中的s...

    junnplus 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<