在Linux下执行二进制文件(C / C ++)时
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)
答案 0 :(得分:2)
f
调用g
,然后调用h
,深度为3个调用,因此需要3个堆栈帧。< / LI>
答案 1 :(得分:2)
- 如何为其进程初始化堆栈?
醇>
这取决于体系结构,但通常,内核在进程的VM中分配一些虚拟内存,并将堆栈指针寄存器设置为指向它的顶部。
- 堆栈如何增长并达到什么限制?
醇>
每个函数调用都使用体系结构定义的过程在堆栈上保留更多空间。这通常被称为“功能序言”。
- 使用ulimit,我可以使用限制数量并使用setrlimit,我可以修改它但是达到了什么限制,我该如何确定?
醇>
ulimit -s
将告诉您当前进程(以及将继承此值的所有子进程,除非被覆盖)的最大堆栈大小(以KB为单位)。
- 是否为所有正在执行的进程分配了相同的堆栈大小?
醇>
参见上一个答案。
相关:强>