为什么在fork之后调用setsid?

时间:2017-07-19 20:42:43

标签: linux unix fork setsid

这是关于Praveen Gollakota'sanother question回答的答案的问题(这是我应该绕过评论特权的方式吗?)。

他回答问题为什么fork两次,实质上是为了确保分叉进程不是会话领导者,因此无法获得tty。他给出了这个分叉过程的例子,并显示第二个孩子不是会话领导者(第二个分叉不是第二个孩子的PID后的SID)。

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()?为什么不分叉一次并退出?

我的猜测是,这与会话领导者是控制终端(或其他祖父母)有关。那么一个后续问题就是,一个团队领导退出但其会话领导者还活着的流程会发生什么?

1 个答案:

答案 0 :(得分:0)

1. `Parent`    = PID: 28084, PGID: 28084, SID: 28046

此时程序有一个控制终端。

2. `Fork#1`    = PID: 28085, PGID: 28084, SID: 28046

此时程序仍然有一个控制终端。如果父项退出,则该子项将属于已放弃的进程组。它可以setpgid()到同一会话中的另一个进程组。

3. `Decouple#1`= PID: 28085, PGID: 28085, SID: 28085

现在该程序在另一个会话中,并且无法setpgid()切换到原始会话中的进程组。

4. `Fork#2`    = PID: 28086, PGID: 28085, SID: 28085

重新显示为init