为什么当父母去世时,孩子的父母会被设置为 systemd?

为什么当父母去世时,孩子的父母会被设置为 systemd?

我一直在读《Understanding the Linux Kernel》一书,其中有一章声称如果父进程在子进程之前死亡,则子进程的父进程将被设置init为 PID 为 的进程1。但是当我实际测试它时,我发现它被设置为进程的名称systemd和PID是1702(这可能是随机的,并且似乎不是恒定的)。

我用来测试这个的代码是:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int 

main() {

    pid_t PID;
    pid_t parentPID;
    pid_t initPID;
    initPID = fork();

    if (initPID < 0) { exit(0); }
    if (initPID == 0) {
            PID = getpid();
            parentPID = getppid();
            printf("Child PID: %d, Parent PID: %d\n", PID, parentPID);
    }
    if (initPID != 0) {
            PID = getpid();
            parentPID = getppid();
            printf("Parent PID: %d, Parent of Parent PID: %d\n", PID, parentPID);
            exit(0);
    }

    PID = getpid();
    parentPID = getppid();
    printf("After death - Child PID: %d, Parent PID: %d\n", PID, parentPID);

}

我编译并运行该程序,得到的输出如下:

[$user]understand the kernel$ gcc child_states.c -o test
[$user]understand the kernel$ ./test 
Parent PID: 7245, Parent of Parent PID: 3698
Child PID: 7246, Parent PID: 7245
After death - Child PID: 7246, Parent PID: 1702
[$user]understand the kernel$ ps -ej | grep 1702
 1702  1702  1702 ?        00:00:00 systemd
 1703  1702  1702 ?        00:00:00 (sd-pam)
[$user]understand the kernel$

答案1

AFAIK systemd 使用 cgroup 来防止子进程逃脱并附加到 PID1,就像以前的旧 init 系统一样。这样就可以保持可追溯性。

相关内容