You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20.04中getrlimit与/proc/self/maps获取栈大小差异解析

进程栈大小两种获取方法的差异解析

两种获取方式及结果

方法1:解析/proc/self/maps

代码实现:

int mapsfd = open("/proc/self/maps",O_RDONLY);
system("cat /dev/fd/3 | grep stack");

返回结果:

7ffe17007000-7ffe17156000 rwxp 00000000 00:00 0 [stack]

通过地址区间计算得当前栈大小:0x14F000 = 1372160字节

方法2:调用getrlimit()函数

代码实现:

struct rlimit limit;
getrlimit(RLIMIT_STACK, &limit);
printf("Stack size = %ld\n", limit.rlim_cur);

返回结果:8388608字节

结果差异的原因及两者区别

  • /proc/self/maps反映的是当前实际分配的栈内存
    Linux进程的栈采用动态增长机制,启动时只会分配一小段初始内存(通常几MB以内),只有当程序实际使用的栈空间超过当前分配范围时,内核才会自动扩展栈,直到达到设定的上限。/proc/self/maps中的栈区间是当前已映射到进程地址空间的栈内存范围,代表的是当前实际占用+已预留的栈大小,并非栈的最大值。

  • getrlimit(RLIMIT_STACK)返回的是栈的最大允许尺寸
    RLIMIT_STACK是内核为进程设定的栈资源限制,其中rlim_cur是当前生效的软限制,代表进程栈最多能增长到的大小(Ubuntu 20.04默认值为8MB)。这个值是栈的上限阈值,不是当前实际使用或已分配的栈大小。

简言之,前者是当前已分配的栈内存量,后者是栈允许增长的最大上限,二者描述的是不同维度的栈属性,因此结果存在差异。

内容的提问来源于stack exchange,提问作者Elias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:55:17