- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试学习如何使用 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/
prctl的原型(prototype)是 int prctl(int option, unsigned long arg2, unsigned long arg3, unsigne
确保子进程在父进程终止时终止是很棘手的。我找到了一个可靠的解决方案 from Python in Linux是指示内核在父进程终止时使用 prctl(PR_SET_PDEATHSIG, SIGTERM
if(prctl(PR_SET_NO_NEW_PRIVS, 1) == -1) err(0, "PR_SET_NO_NEW_PRIVS failed"); 我将上面的代码作为程序的第一行。我总
我正在使用 prctl() 更改 C: 中的 pthreads 线程名称 // Set our thread name to assist with debugging a running pro
据我所知,在父进程死亡时终止子进程的最佳方法是通过 prctl(PR_SET_PDEATHSIG)(至少在 Linux 上):How to make child process die after p
我在 setuid() 调用之后使用了 prctl(pr_set_dumpable, 1) 来启用核心转储生成。我发现使用 prctl(pr_set_dumpable, 1) 也会更改所有者:位于 /
我正在尝试使用 prctl( PR_SET_NAME, "procname", 0, 0, 0) 为进程设置名称,当我阅读有关 PR_SET_NAME 的 Linux 手册时,看起来像如果我理解正确,
RH7 上的 perl-5.24.0 我希望 fork 进程在确定其父进程死亡时自行终止。我读过我可以使用 Linux::Prctl, set_pdeathsig() 来做到这一点。但是我对此的测试似
我有一个正在 fork 到子进程的进程。如果父进程存在,则子进程不应存在。 因此,我在子进程中调用 ::prctl(PR_SET_PDEATHSIG, SIGKILL) 以在父进程死亡时将其杀死。 最
我目前正在尝试学习如何使用 Linux prctl(PR_SET_CHILD_SUBREAPER) 和 prctl(PR_GET_CHILD_SUBREAPER)。 不幸的是,当我使用这些功能时,我似
我需要为一些线程设置名称。 prctl(PR_SET_NAME PR_SET_NAME) 和 pthread_setname_np() 有什么区别? 最佳答案 pthread_setname_np(p
我收到此警告“警告安装 python-prctl,以便可以保证清理进程。”虽然我已经从 this 安装了“python-prctl”地点。但仍然收到此警告,我正在使用 tensorpack 通过使用
我正在尝试安装一些程序(石头,http://www.gcd.org/sengoku/stone/Welcome.en.html) 在带有 Xcode (4.3.3) 的 Max OS linon (1
C 和 C++,我一直在使用 prctl(PR_SET_PDEATHSIG, SIGKILL);它工作得很好。当我在 shell 脚本中生成子进程时,我使用了这样的东西: pid=$!
是否可以执行与 prctl(PR_SET_DUMPABLE, 0) 相同的操作,但对于其他进程,例如一个子进程,还是被 exec 执行的进程?下面的程序演示了可转储标志不是由 execv 的进程继承的
我是一名优秀的程序员,十分优秀!