親が死亡したときに子供の親がsystemdに設定されるのはなぜですか?

親が死亡したときに子供の親がsystemdに設定されるのはなぜですか?

私は「Linuxカーネルを理解する」という本を読んでおり、章の1つでは、親プロセスが子プロセスの前に終了すると、子の親がinitPIDを使用してプロセスに設定されると主張しています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 は、以前の init システムと同様に、サブプロセスがエスケープされて PID1 に接続されるのを防ぐために cgroup を使用します。この方法でトレーサビリティが維持されます。

おすすめ記事