В настоящее время я пытаюсь научиться использовать Linux prctl(PR_SET_CHILD_SUBREAPER)
и prctl(PR_GET_CHILD_SUBREAPER)
.
К сожалению, я не понимаю, что происходит, когда я использую эти функции. Может ли кто-нибудь помочь мне обнаружить ошибку в моем понимании?
Я установил основной процесс как подпочвенный. Затем я попытался использовать fork()
для создания дочернего процесса и сделал это снова, чтобы получить процесс внука. Потом я убил дочерний процесс, чтобы посмотреть, что случилось с внуком, но я не могу это проверить.
int main(void) {
int p = fork();
prctl(PR_SET_CHILD_SUBREAPER, 1);
if(p < 0)
return EXIT_FAILURE;
if(p > 0){
//Main process
printf("I am the MainProcess, My PID: %d and PPID: %d\n", getpid(), getppid());
}
else{
printf("I am the Child, My PID: %d and PPID: %d\n", getpid(), getppid());
int p2 = fork();
if(p2 < 0)
return EXIT_FAILURE;
if(p2 > 0){
//still Child process
}
else{
int *reaper = NULL;
prctl(PR_GET_CHILD_SUBREAPER, reaper);
printf("I am the Grandchild, My PID: %d and PPID: %d\n", getpid(), getppid());
printf("Reaper ID: %d\n", *reaper);
kill(getppid(), SIGKILL);
printf("I am the Grandchild, My PID: %d and PPID: %d\n", getpid(), getppid());
prctl(PR_GET_CHILD_SUBREAPER, reaper);
printf("Reaper ID: %d\n", *reaper);
}
return EXIT_SUCCESS;
}
return EXIT_SUCCESS;
}
Выход:
I am the MainProcess, My PID: 9088 and PPID: 23010
I am the Child, My PID: 9089 and PPID: 9088
I am the Grandchild, My PID: 9090 and PPID: 9089
К моему удивлению, некоторые printf()
вхождения (в части кода granchild) не были вызваны во время выполнения. В чем причина?