这是关于Praveen Gollakota's中another 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()
?为什么不分叉一次并退出?
我的猜测是,这与会话领导者是控制终端(或其他祖父母)有关。那么一个后续问题就是,一个团队领导退出但其会话领导者还活着的流程会发生什么?
答案 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
。