系统相关
首页 > 系统相关> > 如何在Linux中限制C代码的堆大小

如何在Linux中限制C代码的堆大小

作者:互联网

我想知道是否有可能限制在Linux机器上执行的C代码的分配堆大小.

有可能这样做吗?

这样做的目的是,除了其他全局变量和局部变量之外,我正在动态分配〜70KBytes的内存和〜20KBytes的堆栈内存.动态分配通过malloc()完成.

因此,为了确认问题不在于堆分配,我想限制将要运行的C代码的堆内存.

我在线阅读了几篇文章,发现如果我们使用malloc(),则内存可能被过度提交,但是如果我们使用calloc(),我们将仅获得可用内存,而没有过度承诺,​​因为calloc()必须初始化内存块给出指针之前先设置为零.但是由于初始化开销,我不想使用calloc().

解决方法:

您可以在程序内部使用setrlimit(2),可能使用RLIMIT_AS(如Ouah’s answer所引用).

更好的是,让您的外壳做到这一点.使用bash是内置的ulimit.

确保您的程序确实在任何地方都正确且完整地处理了malloc失败(针对NULL指示失败,对malloc的每个返回进行测试).

如果您不测试malloc的结果,则在失败时,它会给出NULL,并且下一条指令很有可能会取消引用空指针(或非常接近它的某个地址),即undefined behavior,而在Linux上给出的是segmentation violation .

您可能应该在调试阶段考虑使用valgrind.

顺便说一句,今天只​​有70KB的内存(至少在Linux笔记本电脑,台式机甚至平板电脑上).请注意,C standard library可能在幕后调用malloc(例如,fopen提供了一个FILE句柄,该句柄具有一些缓冲区,可以通过malloc在内部获取)

并且可以使用以下命令在Linux上禁用memory overcommit

echo 0 > /proc/sys/vm/overcommit_memory

以root身份运行.

标签:memory,heap-memory,c-3,memory-management,linux
来源: https://codeday.me/bug/20191120/2044533.html