我试图理解双叉并在这里偶然发现了这个问题。经过大量研究,这是我想出来的。希望它能帮助有相同问题的人更好地澄清问题。
在 Unix 中,每个进程都属于一个组,该组又属于一个会话。这是层次结构……
会话(SID)→进程组(PGID)→进程(PID)
进程组中的第一个进程成为进程组组长,会话中的第一个进程成为会话组长。每个会话都可以有一个与之关联的 TTY。只有会话负责人可以控制 TTY。对于真正被守护的进程(在后台运行),我们应该确保会话领导者被杀死,这样会话就不可能控制 TTY。
我在我的 Ubuntu 上从 this site 运行了 Sander Marechal 的 python 示例守护程序。这是我的 cmets 的结果。
1. `Parent` = PID: 28084, PGID: 28084, SID: 28046
2. `Fork#1` = PID: 28085, PGID: 28084, SID: 28046
3. `Decouple#1`= PID: 28085, PGID: 28085, SID: 28085
4. `Fork#2` = PID: 28086, PGID: 28085, SID: 28085
请注意,该进程是Decouple#1 之后的会话负责人,因为它是PID = SID。它仍然可以控制 TTY。
请注意,Fork#2 不再是会话负责人PID != SID。此过程永远无法控制 TTY。 真正的守护进程。
我个人觉得术语 fork-twice 令人困惑。更好的习惯用法可能是 fork-decouple-fork。
其他感兴趣的链接: