使用security / limits.conf stacksize 8192kb进行C程序的分段错误

时间:2016-01-05 15:04:30

标签: security stack limits

在linux中,至少在SUSE / SLES版本11中,如果你键入' limit'它会回复

cputime      unlimited
filesize     unlimited
datasize     unlimited
stacksize    8192 kbytes
coredumpsize 1 kbytes
memoryuse    449929820 kbytes
vmemoryuse   423463360 kbytes
descriptors  1024
memorylocked 64 kbytes
maxproc      4135289
maxlocks     unlimited
maxsignal    4135289
maxmessage   819200
maxnice      0
maxrtprio    0
maxrttime    unlimited

这些是我在/etc/security/limits.conf中的默认设置

我有一个C程序,大约5500行代码,最小的注释。 我声明了一些大数组,该程序处理网格结构,因此有一个结构化的节点"具有double类型的x,y,z变量的数组,以及一些其他整数和双变量(如果需要)。并且有一个结构化的元素"具有整数类型的n1,n2,n3变量的数组。在许多函数中,我将声明类似

的内容
struct NodeTYPE nodes[200000];
struct ElemTYPE elements[300000];

运行程序时,会吐出一个菜单来选择要执行的操作,然后输入一个数字。输入1然后调用某个函数,输入2个调用某些不同的函数,依此类推。它们中的大多数都可以工作,但有一个没有,并且一旦调用函数就调试程序,它就会出现分段错误。

如果我修改/etc/security/limits.conf并执行

* hard stacksize unlimited
* soft stacksize unlimited

然后程序无需更改代码中的任何内容即可运行,无需重新编译。该程序通过

编译
gcc myprogram.c -O2 -o myprogram.x -lm

有人可以详细解释为什么会发生这种情况, 什么是解决此类问题的最佳方法?

我的编程是否导致分段错误? 我想在过去说...当我想出使stacksize无限制...如果我把我的大数组全局放在main()之外的程序中那么程序就不会出错...只有当那些大数组声明属于导致此问题的函数。

堆栈大小限制为8MB非常小(我的系统有超过128GB的RAM)?

0 个答案:

没有答案