Linux中,一个进程的栈空间到底有多大?

HostOOP 2003-12-18 07:31:47
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
char buf[8*1024*1024];

sprintf(buf,"%s\n",argv[1]);
printf(buf);
return 0;
}

上面的程序运行时会出现Segmentation fault,原因很简单,栈内存分配得太多,我想知道一个进程的栈空间到底有多大?
...全文
2058 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tkit 2003-12-29
  • 打赏
  • 举报
回复
use "ulimit -s unlimited" to set your maximum stack size
gridcomputing 2003-12-29
  • 打赏
  • 举报
回复
mark
wildhorseych 2003-12-19
  • 打赏
  • 举报
回复
各位高手,linux不是能够自动扩展用户模式堆栈吗?好像说如果不够的时候就产生一个缺页异常
然后自动扩展啊.好像内核模式栈以及进程描述符总共8k.请高手解释一下啊.
HostOOP 2003-12-19
  • 打赏
  • 举报
回复
CoolQ()兄分析得透彻,我也知道仅仅是为buf定义超过8M的内存空间没问题,但对buf进行操作时肯定会溢出。

我知道在Linux中,一个进程的堆栈空间只有8K,能够支持8M的内存空间是由于,kernel启动进程时不会将所有内容都载入自己的堆栈,而是有很合理的内存调度机制。
dchg2000 2003-12-19
  • 打赏
  • 举报
回复
2M
CoolQ 2003-12-19
  • 打赏
  • 举报
回复
HostOOP(碧云黄花),你说的有问题阿。
知道为什么会出现SegmentationFault么?我用objdump得到以下代码
08048460 <main>:
8048460: 55 push %ebp
8048461: 89 e5 mov %esp,%ebp
8048463: 81 ec c8 e0 7f 00 sub $0x7fe0c8,%esp
8048469: 83 ec 0c sub $0xc,%esp
804846c: 68 e8 84 04 08 push $0x80484e8
8048471: e8 c6 fe ff ff call 804833c <_init+0x58>
8048476: 83 c4 10 add $0x10,%esp
8048479: b8 00 00 00 00 mov $0x0,%eax
804847e: c9 leave
804847f: c3 ret
当出现Segmentation的时候,程序停留在804846c: 68 e8 84 04 08 push $0x80484e8这一行,也就是说无法PUSH,如果你这个时候看ESP,已经超出了0xbfffffff-8M的范围,所以才由你说的结果。但是如果你不用printf的话,ESP只是减小了,但是由于没有对相应的内存进行操作,就不会出现SegmentationFault。
另外一点就是,栈的大小不光有你的buf,还有各种环境变量以及argv,都需要占空间的
HostOOP 2003-12-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>

int main()
{
struct rlimit lmt;

getrlimit(RLIMIT_STACK,&lmt);

printf("rlim_cur=%u,rlim_max=%u\n",lmt.rlim_cur,lmt.rlim_max);
}

在我的机器上(Linux Kernel版本为2.4.18-3)输出结果为:
rlim_cur=8388608,rlim_max=4294967295

说明当前的堆栈空间为8M,但作为扩展,最大可支持4G(理论值)

fierygnu 2003-12-19
  • 打赏
  • 举报
回复
用getrlimit(RLIMIT_STACK, ...)获取。
HostOOP 2003-12-19
  • 打赏
  • 举报
回复
说错了,应该是“定义char buf[7*1024*1024];
运行正确”
HostOOP 2003-12-19
  • 打赏
  • 举报
回复
我认为CoolQ() 兄说得对,定义char buf[8*1024*1024];
运行正确,说明Linux可以支持8M的内存空间。我的Linux Kernel版本是2.4.18-3
jian 2003-12-19
  • 打赏
  • 举报
回复
xuexi
CoolQ 2003-12-19
  • 打赏
  • 举报
回复
一个进程的堆栈空间只有8K?
那是内核空间,不是用户空间,不是一个概念的。
而且内核堆栈也不是8K,而是和一个进程的task_struct公用8K空间,两个的增长方式不一样而已。
用户空间的栈的实现方式,你去看看exec的内核源代码吧,具体我记不太清楚了,现在没有时间搞这些东西.至于 wildhorseych() 说的自动扩展,那个没有问题,但是也得有一些限制阿.
CoolQ 2003-12-19
  • 打赏
  • 举报
回复
我的标准是按照2.4.7-10的内核来测试的,不知道高版本是不好一些。
CoolQ 2003-12-19
  • 打赏
  • 举报
回复
是2M么?好像是8M吧?

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧