【问题标题】:What is the purpose of killing parent process and leave child process run after fork()?杀死父进程并让子进程在fork()之后运行的目的是什么?
【发布时间】:2017-11-02 01:44:39
【问题描述】:

我正在阅读 Nginx 开源,我想知道为什么有人会杀死父进程并让子进程处理程序的其余部分?为什么不让父进程处理呢?非常感谢您的帮助。

我使用 Eclipse CDT 调试程序,这导致我的调试陷入死胡同,因为它继续调试父进程,而不是子进程(实际上处理程序的其余部分)。

这是一个sn-p的代码:

ngx_int_t
ngx_daemon(ngx_log_t *log)
{
    int  fd;
    switch (fork()) {
    case -1:
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");
        return NGX_ERROR;

    case 0:

        break;

    default:
    exit(0);

    }
/* Do stuff*/
}

编辑:我知道这个程序是用来解除程序的,但我仍然想知道我们为什么要在一开始就这样做?

【问题讨论】:

  • 这是一种将守护进程与父进程的执行环境断开连接的方法。这也是让程序在后台继续运行而用户可以继续单独工作的一种方式,这在当今有后台作业的shell中并不是严格需要的,只留下第一个原因。
  • 如果您为每个查询分叉,当您更改配置时,您希望让分叉完成他们的工作并杀死父节点以使用新配置启动一个新配置
  • @Someprogrammerdude,感谢您的回复。但是,您介意解释一下我们为什么要disconnect the daemon from the execution environment of the parent process 吗?我已经阅读了 linux 中的守护进程,但我仍然没有清楚地理解它。非常感谢:)
  • @Ôrel 啊,我明白了,现在在 Nginx 上下文中是有意义的。

标签: c linux nginx process fork


【解决方案1】:

解除程序的主要部分是将其与其控制终端断开连接。

为此,请致电setsid()

setsid() 要求调用者不是进程组负责人(进程直接从具有作业控制的 shell 运行)。

如果你fork然后继续在子进程中,子进程肯定不会是进程组长,这使得setsid()调用成功。

之后,您应该重复 fork+exit 过程,以确保继续的孙子也不是会话负责人,确保它仍然没有控制终端(会话负责人(由 setsid() 设置)有能力获取一个控制终端,甚至可能是通过打开终端文件意外打开的)。

【讨论】:

  • 所以我假设 deamonize 程序的目的是让它保持在后台运行并等待请求。为此,我们不是在代码中使用循环,而是通过 fork()exit() 在每个循环上的父进程对其进行去魔化,对吗?
  • 对程序进行去监控实际上主要只是将其与其控制终端断开连接。守护进程的作用(无论它只是将 hello world 打印到日志并退出还是进入服务器循环)与其守护进程状态无关(没有控制终端 + 其他一些小细节)。查看stackoverflow.com/questions/3095566/linux-daemonize
  • 嗨@PSkocik,我现在了解程序的去魔化过程。但是,我仍然对一开始将其除魔的目的感到困惑。根据您的回复,我认为我的第一个假设是错误的。那么为什么我们需要“断开程序与其控制终端的连接”呢?
  • @ToanTran 这是一个非常好的问题。 AFAIK,以防止它在原始终端死机时接收 SIGHUP。这也可以通过忽略 SIGHUP 信号来完成,但守护进程通常会重新利用该信号以导致重新加载配置。此外,控制终端会被继承,并且可以通过/dev/tty 访问。去魔化可以防止这种情况发生。
  • 嗨@PSkocik,澄清一下: - 即使我们忽略它,守护进程也会收到 SIGHUP(我们不希望它,因为我们希望程序继续在后台运行)。 =======> 我们需要:1/deamonize 当前进度以防止这种情况,2/用它的子进度替换当前进度。我们将对子进程做同样的事情,下次用孙进程替换它等等。我现在理解正确了吗?
猜你喜欢
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 2016-02-09
  • 1970-01-01
  • 2010-09-28
相关资源
最近更新 更多