如何在linux中限制c代码的堆大小
我想知道是否有可能限制在linux机器上执行的C代码的分配堆大小 有可能吗 这样做的目的是动态分配~70KBytes内存和~20KBytes堆栈内存(除了其他全局内存和局部内存)。动态分配是通过malloc()完成的 因此,为了确认问题不在于堆分配,我想限制将要运行的C代码的堆内存如何在linux中限制c代码的堆大小,c,linux,memory,memory-management,heap-memory,C,Linux,Memory,Memory Management,Heap Memory,我想知道是否有可能限制在linux机器上执行的C代码的分配堆大小 有可能吗 这样做的目的是动态分配~70KBytes内存和~20KBytes堆栈内存(除了其他全局内存和局部内存)。动态分配是通过malloc()完成的 因此,为了确认问题不在于堆分配,我想限制将要运行的C代码的堆内存 我在网上读了几篇文章,发现如果我们使用malloc(),内存可能会过度提交,但是如果我们使用calloc(),我们将只获得没有过度提交的可用内存,因为calloc()必须在给出指针之前将内存块初始化为零。但是由于初始
我在网上读了几篇文章,发现如果我们使用malloc(),内存可能会过度提交,但是如果我们使用calloc(),我们将只获得没有过度提交的可用内存,因为calloc()必须在给出指针之前将内存块初始化为零。但是由于初始化开销,我不想使用calloc()。在POSIX系统上,您可以使用
setrlimit
函数来限制进程的虚拟内存大小
来自POSIX:
利米特阿什
这是进程的总可用内存的最大大小,单位为
字节。如果超过此限制,则malloc()和mmap()函数
应在errno设置为[ENOMEM]时失败。此外,自动
堆栈增长失败,产生上述效果
您可以(在您的程序中)使用,可能与RLIMIT_AS
(如引用的)
更好的是,让你的外壳去做。使用bash
它是ulimit
内置的
确保您的程序确实正确且完全地处理了所有的malloc
故障(针对NULL
测试malloc
的每次返回,表明其故障)
如果您不测试malloc
的结果,当它失败时,它会给出NULL
,并且很有可能下一条指令会取消引用空指针(或非常接近它的某个地址),而在Linux上,这是一个空指针
你可能应该考虑在调试阶段使用。
顺便说一句,如今70KB的内存很小(至少在Linux笔记本电脑、台式机甚至平板电脑上)。请注意,可以在引擎盖下调用malloc
(例如,fopen
提供一个文件
句柄,该句柄具有一些缓冲区,可以通过malloc
在内部获得)
并且可以在Linux上使用以下命令禁用
echo 0 > /proc/sys/vm/overcommit_memory
以root用户身份运行。您确定微小的
calloc
开销(仅与小对象相关)值得避免吗?你量过了吗?大型堆区域通常通过mmap
进行malloc-ated(在Linux上),这将提供零内存!你正在努力解决的真正问题是什么?请编辑您的问题以改进它!嗨,巴兹尔,谢谢你的回复。我在嵌入式平台上使用C代码,结果崩溃了。对于一个错误的地址,崩溃看起来像是内存问题。这就是我想限制我的C代码堆内存并在PC平台上调试的原因。u应该回显1以禁用Overmit,而不是0