为什么在Linux上执行fork或exec之后RLIMIT_STACK丢失了?

在Linux上,据说一个进程的rlimit在forkexec之后保持不变。 但是在fork之后或者exec之后,我在子里失去了我的RLIMIT_STACK。 请有人给一些解释?

这是我的程序的一些描述性输出。

//父母有这样的RLIMIT_STACK

RLIMIT_STACK,软 – 10485760,硬 – -1

//在fork之后,孩子失去了RLIMIT_STACK

在fork后的孩子,RLIMIT_STACK,soft – -1,hard – -1

//在执行前的子代中,RLIMIT_STACK软件再次被设置为10485760

RLIMIT_STACK设置OK。

在孩子设置后,RLIMIT_STACK,soft – 10485760,hard – -1孩子pid = 3096

//执行完后,新进程再次丢失RLIMIT_STACK

RLIMIT_STACK得到了,软-1,硬-1

提前致谢

这似乎是一个libthread线程实现的问题(我不确定是否是一个bug)。
我写了一个简单的程序:

 #include <errno.h> #include <stdio.h> #include <string.h> #include <sys/resource.h> #include <sys/time.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main(int argc, char **argv){ struct rlimit resource_limit; if(getrlimit(RLIMIT_STACK, &resource_limit) != 0){ fprintf(stderr, "Failed to get rlimit: %s\n", strerror(errno)); return 1; } else{ fprintf(stderr, "In parent, RLIMIT_STACK, soft-%d, hard-%d\n", resource_limit.rlim_cur, resource_limit.rlim_max); } int child_status = 0; pid_t pid = fork(); switch(pid){ case 0://child if(getrlimit(RLIMIT_STACK, &resource_limit) != 0){ fprintf(stderr, "Failed to get rlimit: %s\n", strerror(errno)); return 1; } else{ fprintf(stderr, "In child after fork, RLIMIT_STACK, soft-%d, hard-%d\n", resource_limit.rlim_cur, resource_limit.rlim_max); } break; case -1: fprintf(stderr, "Fork error: %s\n", strerror(errno)); break; default://parent waitpid(pid, &child_status, 0); break; } return 0; 

}

如果这个程序编译和链接没有-lpthread选项,它到处运行OK。 但是,当它与-lpthread选项链接时,会发生有线事情:如果它运行在与libpthread的linuxthread版本动态链接的机器上,则会发出:

 In parent, RLIMIT_STACK, soft-10485760, hard--1 In child after fork, RLIMIT_STACK, soft--1, hard--1 

但是当它运行在一个动态链接到libpthread的NPTL版本的机器上时,它会给出预期的结果:

 In parent, RLIMIT_STACK, soft-10485760, hard--1 In child after fork, RLIMIT_STACK, soft-10485760, hard--1