CHILD_SUBREAPER位是否在fork()中持续存在?

时间:2015-08-13 19:26:15

标签: linux fork

当进程使用prctl(PR_SET_CHILD_SUBREAPER, 1)documented here)设置子subreaper位时,是否需要使用prctl(PR_SET_CHILD_SUBREAPER, 0)在fork后清除它?

1 个答案:

答案 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