int main()
{
if (!fork()) sleep(3000);
exit(0);
}
从 shell 调用上面的程序会产生一个孤立进程
- 被
init
或采用upstart
(在我的 Ubuntu 桌面上) - 与 shell 位于同一会话中
- 失去组长
- 不受 shell 作业控制的管理,这意味着即使 shell 收到 SIGHUP 也不会收到 SIGHUP
关于 4:我已经在bash
我的 Ubuntu 桌面上测试并确认了这一点。不确定这是否适用于 SIGHUP 以外的信号。如果您的disown
作业也是如此:未按jobs
命令列出的进程组将不会收到 SIGHUP。
由于我们还可以关闭所有 FD 和chdir
,并记录到文件,因此这与普通守护进程之间的唯一区别是:
- 我的进程仍然与 shell 共享同一个会话
- 我的进程仍然有一个“控制 tty”,如所示
ps j
所以我的问题是:我们可以将此进程视为守护进程吗?
或者换句话说,为什么守护进程在setsid()
没有 ctty 的新会话( call )中如此重要,因为它与调用 shell 的同一会话中没有任何关系(如果不是,请纠正我)与 ctty 连接吗?
或者换句话说:为什么对于想要充当守护进程的进程来说,保持其会话不变并仍然连接到终端(即使我们关闭其 FD)是不好的?
我认为这些问题本质上是一致的。提前致谢。