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