在Linux上,据说一个进程的rlimit在fork或exec之后保持不变。 但是在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