fork & exit 是否会使进程成为守护进程?

fork & exit 是否会使进程成为守护进程?
int main()
{
    if (!fork()) sleep(3000);
    exit(0);
}

从 shell 调用上面的程序会产生一个孤立进程

  1. init或采用upstart(在我的 Ubuntu 桌面上)
  2. 与 shell 位于同一会话中
  3. 失去组长
  4. 不受 shell 作业控制的管理,这意味着即使 shell 收到 SIGHUP 也不会收到 SIGHUP

关于 4:我已经在bash我的 Ubuntu 桌面上测试并确认了这一点。不确定这是否适用于 SIGHUP 以外的信号。如果您的disown作业也是如此:未按jobs命令列出的进程组将不会收到 SIGHUP。

由于我们还可以关闭所有 FD 和chdir,并记录到文件,因此这与普通守护进程之间的唯一区别是:

  1. 我的进程仍然与 shell 共享同一个会话
  2. 我的进程仍然有一个“控制 tty”,如所示ps j

所以我的问题是:我们可以将此进程视为守护进程吗?

或者换句话说,为什么守护进程在setsid()没有 ctty 的新会话( call )中如此重要,因为它与调用 shell 的同一会话中没有任何关系(如果不是,请纠正我)与 ctty 连接吗?

或者换句话说:为什么对于想要充当守护进程的进程来说,保持其会话不变并仍然连接到终端(即使我们关闭其 FD)是不好的?

我认为这些问题本质上是一致的。提前致谢。

参考文献(但没有说服我)

相关内容