CHILD_SUBREAPER 位是否在 fork() 中持续存在?
Does the CHILD_SUBREAPER bit persist across fork()?
当一个进程用prctl(PR_SET_CHILD_SUBREAPER, 1)
(documented here)设置子subreaper位时,是否需要在fork后使用prctl(PR_SET_CHILD_SUBREAPER, 0)
清除它?
不,子 subreaper 位不会跨分叉持续存在。
相关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
当一个进程用prctl(PR_SET_CHILD_SUBREAPER, 1)
(documented here)设置子subreaper位时,是否需要在fork后使用prctl(PR_SET_CHILD_SUBREAPER, 0)
清除它?
不,子 subreaper 位不会跨分叉持续存在。
相关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