如何在编写C程序时设置内存使用限制,如果超过此限制会发生什么?

时间:2012-02-05 23:32:07

标签: c linux memory-management

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

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

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

3 个答案:

答案 0 :(得分:3)

您应该使用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将返回一个空指针。

答案 1 :(得分:1)

请参阅系统中的ulimit命令。

来自man页面:

-v   The maximum amount of virtual memory available to the process

如果您的程序写得很好,则应该考虑动态内存分配失败的情况:检查malloccallocrealloc函数的返回值。

答案 2 :(得分:1)

在Linux上,在C程序中,使用setrlimit()设置程序的执行环境限制。例如,当你的内存不足时,对malloc()的调用将返回NULL等。

#include <sys/resource.h>

{ struct rlimit rl = {32000, 32000}; setrlimit(RLIMIT_AS, &rl); }