如何多次更改核心文件大小限制?

时间:2016-03-10 12:51:32

标签: c++ c linux gnu

我想多次更改核心文件大小。我使用以下代码:

#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成功,第二次调用失败,打印“不允许操作”。为什么呢?

1 个答案:

答案 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等来获取您的数据处理)