这是一个关于Praveen Gollakota在另一个问题中的回答的问题(这是我应该绕过评论特权的方式吗?)。
他对为什么分叉两次的问题的回答,本质上是为了确保分叉的进程不是会话负责人,因此无法获得 tty。他给出了这个fork过程的例子,并表明第二个孩子不是会话领导者(第二个fork之后的SID不是第二个孩子的PID)。
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
但是,您也可以在这里看到,在第一次分叉之后和“解耦”步骤之前(我假设这是对 的调用setsid()
),孩子不是会话负责人。因此我的问题是为什么打电话setsid()
?为什么不分叉一次并退出?
我的猜测是,这与会话负责人作为控制终端(或其他祖父母)有关。所以接下来的问题是,如果组长退出但会话组长还活着的进程会发生什么?