gpt4 book ai didi

c - 在设置 subreapers 时,是否有一些关于如何使用 prctl() 的简短示例?

转载 作者:行者123 更新时间:2023-12-04 17:35:24 27 4
gpt4 key购买 nike

我目前正在尝试学习如何使用 Linux prctl(PR_SET_CHILD_SUBREAPER)prctl(PR_GET_CHILD_SUBREAPER)

不幸的是,当我使用这些功能时,我似乎不明白发生了什么。有人可以帮助我发现我理解上的错误吗?

我已经将主进程设置为 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 部分)并未在运行时调用。这是什么原因?

最佳答案

这是一个关于 PR_SET_CHILD_SUBREAPER 工作原理的小程序

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

int main(void)
{
int *status;
int i=0;

prctl(PR_SET_CHILD_SUBREAPER, 1, 0, 0, 0);
perror("PARENT:Set");
printf("PARENT: %d : my dad : %d\n", getpid(), getppid());
if(fork() != 0)
{
while(1)
{
wait(status);
if(++i == 2)
{
break;
}
}
int p = 1;
prctl(PR_GET_CHILD_SUBREAPER, &p);
printf("PARENT : %d\n",p);
printf("PARENT Exiting\n");
}
else
{
printf("Before CHILD: %d: my dad %d\n",getpid(), getppid());
if(fork() == 0)
{
int p = 1;
printf("Before grandchild: %d: my dad %d\n",getpid(), getppid());
sleep(2);
printf("After grandchild: %d: my dad %d\n",getpid(), getppid());
prctl(PR_GET_CHILD_SUBREAPER, &p);
printf("After grandchild : %d\n",p);
printf("Grandchild Exiting\n");
exit(0);
}
else
{
int p = 1;
prctl(PR_GET_CHILD_SUBREAPER, &p);
printf("After CHILD : %d\n",p);
printf("After CHILD: %d: my dad %d\n",getpid(), getppid());
printf("CHILD Exiting\n");
exit(1);
}
}
return 0;
}

输出:

PARENT:Set: Success
PARENT: 4002 : my dad : 2222
Before CHILD: 4003: my dad 4002
After CHILD : 0
After CHILD: 4003: my dad 4002
CHILD Exiting
Before grandchild: 4004: my dad 4003
After grandchild: 4004: my dad 4002
After grandchild : 0
Grandchild Exiting
PARENT : 1
PARENT Exiting

观察:

PARENT进程(4002)通过设置PR_SET_CHILD_SUBREAPER成为了sub reaper

PARENT 进程 (4002) 已经 fork 并创建了 CHILD 进程 (4003)

CHILD 进程 (4003) 已经 fork 并创建了 Grandchild 进程 (4004)

CHILD 进程 (4003) 尝试使用 PR_GET_CHILD_SUBREAPER 并收到 0。因为 prctl() 只有实例,它不会保留在 fork 进程中。 Does the CHILD_SUBREAPER bit persist across fork()?

CHILD 进程(4003) 终止使孙进程(4004) 成为孤儿进程

因为 PARENT 进程 (4002) 已被设置为 SUBREAPER Grandchild 进程 (4004) 成为 PARENT 进程 (4002) 的子进程并且 Grandchild 进程 (4004) 的退出状态被 PARENT 进程 (4002) 接收,因为,子进程已终止

关于c - 在设置 subreapers 时,是否有一些关于如何使用 prctl() 的简短示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56856275/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com