如何在 linux 中限制 c 代码的堆大小

How to limit heap size for a c code in linux

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

可以这样做吗?

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

所以为了确认问题不在于堆分配,我想限制 C 代码的堆内存,这将是 运行。

网上看了一些文章,发现如果使用malloc(),内存可能会overcommitted,但是如果使用calloc(),我们只会得到可用的内存,不会overcommitment,因为calloc()有在给出指针之前将内存块初始化为零。但由于初始化开销,我不想使用 calloc()。

在 POSIX 系统上,您可以使用 setrlimit 函数来限制进程的虚拟内存大小。

来自 POSIX documentation:

RLIMIT_AS

This is the maximum size of total available memory of the process, in bytes. If this limit is exceeded, the malloc() and mmap() functions shall fail with errno set to [ENOMEM]. In addition, the automatic stack growth fails with the effects outlined above.

您可以使用(在您的程序中)setrlimit(2), probably with RLIMIT_AS (as cited by ).

更好的是,让您的 shell 做到这一点。对于 bash,它是 ulimit 内置的。

确保您的程序确实正确且完整地处理了所有地方的 malloc 故障(测试 malloc 的每个 return 与 NULL 表明其故障)。

如果你不测试 malloc 的结果,当它失败时,它给出 NULL 并且下一条指令很可能会取消引用空指针(或某些地址非常接近),即 undefined behavior and on Linux giving a segmentation violation.

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

顺便说一句,70 KB 的内存在今天已经很小了(至少在 Linux 笔记本电脑、台式机甚至平板电脑上是这样)。请注意,C standard library 可能会在幕后调用 malloc(例如,fopen 给出一个 FILE 句柄,它有一些缓冲区,可以通过 malloc)

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

echo 0 > /proc/sys/vm/overcommit_memory

作为 root 运行。