我想多次更改核心文件大小。我使用以下代码:
#include <errno.h>
#include <iostream>
#include <string.h>
#include <sys/prctl.h>
#include <sys/resource.h>
void SetNewCoreSizeLimit(unsigned new_size) {
rlimit resource_limit;
resource_limit.rlim_cur = resource_limit.rlim_max = static_cast<rlim_t>(new_size);
if (setrlimit(RLIMIT_CORE, &resource_limit) == -1) {
std::cerr << strerror(errno) << std::endl;
}
}
int main() {
SetNewCoreSizeLimit(5);
SetNewCoreSizeLimit(10);
return 0;
}
第一次调用setrlimit成功,第二次调用失败,打印“不允许操作”。为什么呢?
答案 0 :(得分:2)
仔细阅读 setrlimit(2):
每个资源都有一个关联的 soft 和 hard 限制。
你正在改变这两个。设置 hard 限制后,您无法提升(在普通流程中):
EPERM
一个无特权的进程试图提高硬限额;该 执行此操作需要CAP_SYS_RESOURCE功能。
EINVAL
资源中指定的值无效;或者,对于 setrlimit()或prlimit():rlim->rlim_cur
大于rlim->rlim_max
。
您可能应该仅设置 soft 限制:
resource_limit.rlim_cur = static_cast<rlim_t>(new_size);
resource_limit.rlim_max = RLIM_INFINITY;
或使用getrlimit
查询之前的限制并保留其.rlim_max
字段。
您的shell可能已经设置了一些限制(例如,在ulimit
中使用~/.bashrc
)。
您可以尝试cat /proc/self/limits
查询您的shell中的限制(以可理解的文本方式)
请注意,具有超级用户权限的用户仍然可以使用gcore(1)(或使用proc(5)至/proc/$(pidof yourapp)/maps
&amp; /proc/$(pidof yourapp)/mem
等来获取您的数据处理)