我知道所有孤立进程都被 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 进程。