为什么这个孤立进程是由init的子进程调用的而不是由init调用的?

为什么这个孤立进程是由init的子进程调用的而不是由init调用的?

我知道所有孤立进程都被 init 进程(母进程)接管,但我编写了一个程序来了解进程的实际工作方式,并注意到孤立进程被 init 的子进程接管。我想知道为什么会发生这种情况?

C 代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>


int main(void)
{
        pid_t pid = fork();

        if (pid == -1)
        {
                printf("An error occured\n");
                exit(98);
        }

        if (pid == 0)
        {
                sleep(10);
                pid_t id = getppid();
                pid_t id1 = getpid();
                printf("PPID: %u PID: %u\n", id, id1);
        }

        else
        {

                pid_t id = getppid();
                pid_t id1 = getpid();
                printf("PPID: %u PID: %u\n", id, id1);
        }

        return (0);
}

流程

root           1       0  0 Jul27 ?        00:00:06 /sbin/init splash
maxwell     2180       1  0 Jul27 ?        00:00:03 /lib/systemd/systemd --user
maxwell     7039    2180  0 00:49 pts/1    00:00:00 ./a.out

答案1

[A] 所有孤立进程均由 init 进程接管。

Linux 不再有这种情况。在 3.4 版中,Linux 获得了“subreaper”功能。请参阅这个关于 Unix 和 Linux 的答案完整解释,但要点是,当一个进程变成孤儿进程时,内核会向最近的祖先进程发出信号,该进程被标记为子收割者(如果没有,则返回到 init)。当 systemd 通过运行会话 init 进程(您看到的/lib/systemd/systemd --user)启动用户会话时,它会将自己标记为子收割者,因此该会话中的孤儿进程(可能)将重新归属于会话 init,而不是系统 init 进程。

相关内容