当进程使用prctl(PR_SET_CHILD_SUBREAPER, 1)
(documented here)设置子subreaper位时,是否需要使用prctl(PR_SET_CHILD_SUBREAPER, 0)
在fork后清除它?
答案 0 :(得分:2)
不,子subreaper位不会在forks中持续存在。
相关的Linux内核代码is in copy_signal()
in kernel/fork.c
:信号结构初始化为全零,is_child_subreaper
位从未设置。
但是,has_child_subreaper
已设置:
sig->has_child_subreaper = current->signal->has_child_subreaper ||
current->signal->is_child_subreaper;
此测试程序演示了行为:
#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
int main(int argc, char** argv) {
int pid;
int i;
prctl(PR_SET_CHILD_SUBREAPER, 1);
prctl(PR_GET_CHILD_SUBREAPER, &i);
printf("Before fork: %d\n", i);
pid = fork();
if (pid < 0) {
return 1;
} else if (pid == 0) {
prctl(PR_GET_CHILD_SUBREAPER, &i);
printf("In child: %d\n", i);
return 0;
}
return 0;
}
输出:
Before fork: 1
In child: 0