2

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

我的猜测是,这与会话负责人作为控制终端(或其他祖父母)有关。所以接下来的问题是,如果组长退出但会话组长还活着的进程会发生什么?

4

1 回答 1

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

于 2017-07-19T22:06:43.020 回答