getrlimit中RLIMIT_STACK的硬限制为-1是什么意思?如何解决?
关于多线程应用栈限制硬限制为-1的问题解答
硬限制为-1的含义
- 这里的-1对应系统定义的宏
RLIM_INFINITY,表示栈的硬限制没有上限(或者说受限于系统物理内存/虚拟内存的实际总量)。 - 出现这个值是因为多数现代Linux系统默认不对栈的硬限制做固定数值约束,而是让其根据系统内存动态调整。
段错误的可能原因及解决方法
虽然硬限制无上限,但你遇到段错误大概率是栈的软限制(rlim_cur)太小,多线程环境下每个线程都有独立栈空间,累计或单个线程栈溢出就会触发segfault。
解决步骤:
- 确认当前软限制:先看你代码输出的
soft limit数值,默认通常是8MB左右,对多线程应用可能不够。 - 临时调整软限制(当前会话有效):
- 用命令行:
ulimit -s <新数值>,比如ulimit -s 16384(设置为16MB) - 用代码调整(需进程有足够权限,一般非特权进程可将软限调高到硬限):
struct rlimit new_lim; // 先获取当前限制 getrlimit(RLIMIT_STACK, &new_lim); // 将软限制设为更大值,比如16MB(16*1024*1024=16777216) new_lim.rlim_cur = 16777216; // 若要调更高,只要不超过硬限(这里硬限是无限) // new_lim.rlim_cur = new_lim.rlim_max; // 直接拉满到硬限 if (setrlimit(RLIMIT_STACK, &new_lim) != 0) { fprintf(stderr, "Set limit failed: %s\n", strerror(errno)); }
- 用命令行:
- 永久调整限制(系统全局或用户级):
- 编辑
/etc/security/limits.conf,添加:<用户名> soft stack 16384 <用户名> hard stack unlimited - 或者编辑
/etc/profile或用户的~/.bashrc,加入ulimit -s 16384,重启会话生效。
- 编辑
- 代码层面优化:
- 避免在栈上分配大内存块(比如大数组、大结构体),改用堆内存(
malloc/calloc/mmap)。 - 检查多线程创建时的栈大小设置,部分线程库允许创建线程时指定栈大小(比如
pthread_attr_setstacksize),按需调整。
- 避免在栈上分配大内存块(比如大数组、大结构体),改用堆内存(
注意事项
- 不要盲目把栈限制拉到最大,过大的栈会占用更多虚拟内存,可能影响系统整体稳定性。
- 若调整后仍出现段错误,需用
gdb或valgrind排查是否是其他内存问题(比如野指针、堆溢出),不一定是栈的问题。
内容的提问来源于stack exchange,提问作者Krishna Nair
相关产品推荐
相关产品推荐

