首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时应将errno分配给ENOMEM?

何时应将errno分配给ENOMEM?
EN

Stack Overflow用户
提问于 2012-06-10 11:11:49
回答 4查看 19K关注 0票数 10

当内存耗尽时,内核将终止以下程序。我想知道全局变量何时应该分配给"ENOMEM“。

代码语言:javascript
复制
#define MEGABYTE 1024*1024
#define TRUE 1
int main(int argc, char *argv[]){

    void *myblock = NULL;
    int count = 0;

    while(TRUE)
    {
            myblock = (void *) malloc(MEGABYTE);
            if (!myblock) break;
            memset(myblock,1, MEGABYTE);
            printf("Currently allocating %d MB\n",++count);
    }
    exit(0);
}
EN

回答 4

Stack Overflow用户

发布于 2012-06-10 11:16:56

首先,修复您的内核,使其不过度使用:

代码语言:javascript
复制
echo "2" > /proc/sys/vm/overcommit_memory

现在,malloc应该可以正常运行了。

票数 6
EN

Stack Overflow用户

发布于 2012-06-10 11:17:39

当你试图一次分配太多的内存时,就会发生这种情况。

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char *argv[])
{
  void *p;

  p = malloc(1024L * 1024 * 1024 * 1024);
  if(p == NULL)
  {
    printf("%d\n", errno);
    perror("malloc");
  }
}

在您的情况下,OOM杀手首先进入流程。

票数 5
EN

Stack Overflow用户

发布于 2012-06-10 13:46:16

正如"R“所暗示的,问题在于Linux内存管理的默认行为,即”过量使用“。这意味着内核声称成功地为你分配了内存,但实际上直到你试图访问它时才实际分配内存。如果内核发现它分配了太多的内存,它会用“OOM (内存不足)杀手”杀死一个进程,以释放一些内存。它选择要终止的进程的方式很复杂,但如果您刚刚分配了系统中的大部分内存,那么很可能是您的进程受到了打击。

如果你认为这听起来很疯狂,有些人会同意你的观点。

就像R说的那样,让它像你所期望的那样运行:

echo "2" > /proc/sys/vm/overcommit_memory

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10966121

复制
相关文章

相似问题

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