首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在编写C程序时,如何设置内存使用限制?如果超过这个限制,会发生什么?

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

Stack Overflow用户
提问于 2012-02-05 23:32:07
回答 3查看 6.6K关注 0票数 6

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

  1. 如何限制我的c++程序消耗的总内存?如果我对c程序设置了内存限制,例如32M,如果它需要的内存比32m大得多,那么会发生什么?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-06 01:25:51

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

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

票数 5
EN

Stack Overflow用户

发布于 2012-02-05 23:33:23

请参阅系统中的ulimit命令。

来自man页面:

代码语言:javascript
复制
-v   The maximum amount of virtual memory available to the process

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

票数 2
EN

Stack Overflow用户

发布于 2012-02-05 23:36:13

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

代码语言:javascript
复制
#include <sys/resource.h>

{ struct rlimit rl = {32000, 32000}; setrlimit(RLIMIT_AS, &rl); }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9154115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档