setrlimit调用失败返回EINVAL且rlim_max为0的问题求助
RLIMIT_CORE调用setrlimit返回EINVAL且rlim_max=0的原因与解决办法
原因分析
- 当
getrlimit返回的rlim_max为0,说明系统对core文件大小的硬限制被锁死在0,进程的软限制(rlim_cur)绝对不能超过硬限制。你代码里把rlim_cur设为RLIM_INFINITY,明显超出了0的硬限制,所以setrlimit直接返回EINVAL错误。 - 这种情况一般是系统管理员通过配置强制禁用了core文件生成,或者某些安全加固工具修改了全局限制。
解决办法
临时修复(当前会话有效)
- 用root权限执行命令放开core文件的硬限制:
重启第三方产品进程后,再跑代码时ulimit -Hc unlimitedgetrlimit拿到的rlim_max就会变成无限大,设置RLIM_INFINITY就能成功。
永久生效(重启系统后依然有效)
- 编辑
/etc/security/limits.conf,添加或修改这两行:
保存后,新登录的会话会自动应用这个配置,现有进程需要重启才能生效。* hard core unlimited * soft core unlimited
代码兼容(无法改系统配置时用)
- 在代码里加个判断,先检查硬限制是否为0,要是为0就别强行设置无限大了:
rlimit Limit; if (getrlimit(RLIMIT_CORE, &Limit) != 0) { return; } // 硬限制为0时不修改软限制 if (Limit.rlim_max != 0) { Limit.rlim_cur = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &Limit); }
内容的提问来源于stack exchange,提问作者0xBADF00
相关产品推荐
相关产品推荐

