Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux中限制c代码的堆大小_C_Linux_Memory_Memory Management_Heap Memory - Fatal编程技术网

如何在linux中限制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()必须在给出指针之前将内存块初始化为零。但是由于初始

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

有可能吗

这样做的目的是动态分配~70KBytes内存和~20KBytes堆栈内存(除了其他全局内存和局部内存)。动态分配是通过malloc()完成的

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


我在网上读了几篇文章,发现如果我们使用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