当一个二进制文件(C/C++)在Linux下执行时,
- 如何为进程初始化堆栈?
- 堆栈如何增长以及达到什么限制?
- 使用
ulimit
,我可以有一个限制数量,通过使用setrlimit
,我可以修改它,但是到什么限制,我怎么能确定呢?< - 是否为所有执行进程分配了相同的堆栈大小?
如您在下面的代码中所见,我递归调用 func() 仅用于推送操作,堆栈增长到大约 8 MB。它崩溃了(堆栈溢出!)。
void func()
{
static int i=0;
int arr[1024]={0};
printf("%d KB pushed on stack!\n",++i*sizeof(int));
func();
}
int main()
{
func();
return 0;
}
output snippet:
8108 KB pushed on stack!
8112 KB pushed on stack!
8116 KB pushed on stack!
8120 KB pushed on stack!
Segmentation fault (core dumped)
- 这大约 8 MB 来自哪里?
最佳答案
- 堆栈是启动时与进程关联的各种内存区域之一,在运行时可能会发生变化。其他可以是text/code、heap、static/bss等。
- 每次调用函数时,堆栈都会增长。在它上面添加了一个堆栈框架。堆栈帧是执行给定函数所必需的(参数、返回值、局部变量)。每次您从函数返回时,堆栈都会收缩,收缩量与增长量相同。
- 您可以尝试估计函数调用树的深度(
f
调用g
,后者又调用h
,深度为 3调用,所以 3 个堆栈帧)。 - 是的,操作系统设计者估计有一个默认值。这个尺寸通常就足够了。
- 这是与您的操作系统关联的默认常量。
关于c++ - 在 Linux 下如何为可执行文件分配堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28737919/