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

How to change core file size limit multiple times?

本文关键字:文件大小 核心 何多次      更新时间:2023-10-16

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

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

仔细阅读 setrlimit(2):

每个资源都有关联的限制和限制。

你正在改变这两个。设置硬限制后,您将无法提高它(在普通过程中):

EPERM 一个非特权进程试图提高硬性限制; 执行此操作需要CAP_SYS_RESOURCE能力。

EINVAL 资源中指定的值无效;或者,对于 setrlimit() 或 prlimit():rlim->rlim_cur大于 rlim->rlim_max

您可能应该设置限制:

 resource_limit.rlim_cur = static_cast<rlim_t>(new_size);
 resource_limit.rlim_max = RLIM_INFINITY;

或者使用 getrlimit 查询以前的限制并保留其.rlim_max字段。

你的 shell 可能已经设置了一些限制(例如,在你的~/.bashrc中使用ulimit)。

您可以尝试cat /proc/self/limits在 shell 中查询您的限制(以可理解的、文本的方式)

请注意,具有 root 访问权限的用户仍然可以使用 gcore(1)(或者使用 proc(5) 到 /proc/$(pidof yourapp)/maps & /proc/$(pidof yourapp)/mem 等来获取进程内的数据)