c - 写C程序时如何设置内存使用限制,一旦超过这个限制会怎样?

标签 c linux memory-management

我在 linux 上写一个 C 程序,我想知道:

  1. 如何限制我的 c 程序消耗的总内存?

  2. 如果我为我的 c 程序设置内存限制,比如 32M,如果它需要比 32M 多得多的内存会怎样?

最佳答案

您应该使用 setrlimit 系统调用,使用 RLIMIT_DATA 和 RLIMIT_STACK 资源分别限制堆和栈的大小。使用 RLIMIT_AS 或 RLIMIT_RSS 很诱人,但您会发现它们在许多旧的 Linux 内核上不能可靠地工作,而且我在内核邮件列表上看不到任何迹象表明问题已在最新内核中得到解决。一个问题涉及如何将 mmap 的内存计入或不计入限制总数。由于 glibc malloc 使用 mmap 进行大量分配,即使不直接调用 mmap 的程序也可能超出限制。

如果您超过 RLIMIT_STACK 限制(调用堆栈太深,或在堆栈上分配太多变量),您的程序将收到 SIGSEGV。如果您尝试将数据段扩展到超过 RLIMIT_DATA 限制(brk、sbrk 或诸如 malloc 之类的中介),则尝试将失败。 brk 或 sbrk 将返回 < 0,而 malloc 将返回一个空指针。

关于c - 写C程序时如何设置内存使用限制,一旦超过这个限制会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9154115/

相关文章:

android - 在gstreamer管道中使用encodebin

linux - C++/Linux : Using c++11 atomic to avoid partial read on dual-mapped mmap region

c - 使用 free() 时大小为 4 的无效读取

c - 动态数组自动收缩

c - 如何将自己的输出通过管道传递给另一个进程?

linux - 将变量的内容写入文件

C、sendfile()和send()的区别?

c++ - 我可以检查缓存中是否有一 block 内存(例如,使用 malloc 分配)吗?

Android Studio - 如何增加分配的堆大小

c - 从链表结构中检索值给出错误的值