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