c - mmap > 1GB 失败,错误号 12

标签 c linux mmap

在 Linux 2.6.37.6 上,当大小 > 1GB 时,我的 mmap 会失败,并显示 errno 12。

有什么想法吗?我有 64GB 内存

# swapon -s
Filename                Type        Size    Used    Priority
/dev/sda1                               partition   65537160    0   -1

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 495694
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 495694
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

编辑:添加了 uname -a

#root@maverick-5:~# uname -a
Linux maverick-5 2.6.37.6 #5 SMP Fri Feb 14 16:21:40 PST 2014 x86_64 GNU/Linux

编辑:免费添加

#free
         total       used       free     shared    buffers     cached
Mem:      63459224     317692   63141532          0      25800      36280
-/+ buffers/cache:     255612   63203612
Swap:     65537160          0   65537160

编辑:它是具有 64GB RAM 的 64 位系统:

# cat /proc/meminfo
MemTotal:       63459224 kB    ...

编辑:添加 mmap 代码

...
*fd = open(file_path, O_RDWR, 0644);
if (*fd==-1){
  printf("open file failed \n");
  exit();
}
system("ulimit -m -v");
mem = mmap(0,0x80000000,PROT_READ|PROT_WRITE,MAP_NORESERVE|MAP_PRIVATE,*fd,0);
if (mem == MAP_FAILED){
  printf("map failed failed %d %d\n", errno, mem);
  exit();
}

最佳答案

您应该始终测试系统调用的结果。阅读 mmap(2)所以代码

mem = mmap(0,size_of_segment, PROT_READ|PROT_WRITE, 
           MAP_NORESERVE|MAP_PRIVATE,*fd,0);
if (mem == MMAP_FAILED) 
     { perror("mmap size_of_segment"); exit(EXIT_FAILURE); };

我们不知道size_of_segment包含什么,以及*fd是什么。实际上,我不确定在 mmap 处理文件时使用 MAP_NORESERVE 是否明智。将 MAP_NORESERVEMAP_ANONYMOUS 结合使用(保留地址空间而不消耗交换空间)或省略 MAP_NORESERVE;如果您想访问和修改该文件,请使用MAP_SHARED:

mem = mmap(0,size_of_segment, PROT_READ|PROT_WRITE, 
           MAP_SHARED,*fd,0);
if (mem == MMAP_FAILED) 
     { fprintf (stderr, "mmap size_of_segment=%ld *fd=%d failed %s\n",
                (long)size_of_segment, *fd, strerror(errno));
       exit(EXIT_FAILURE); };

在我的系统上 ENOMEM 是 12,然后 perror 打印(或 strerror 给出)Cannot allocate memory 这是非常不言自明的。 mmap(2)手册页讲述:

   ENOMEM No memory is available, or the process's maximum number of
          mappings would have been exceeded.

但是 Posix mmap讲述一个不同的故事;也许你的内存映射太多了。查看 /proc/1234/maps 查找 pid 1234 的进程。

关于c - mmap > 1GB 失败,错误号 12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22925566/

相关文章:

c - C中位操作的奇怪行为

c - 以下代码输出背后的逻辑是什么?

c - 链表 - 追加节点 : loop or pointer?

c - 读写 mmap 的参数无效?

c - 如何创建二维数组?

c - shell 实现 : signal handling: Any way to return early from wait()?

java - 失败 - 上下文路径中的应用程序/应用程序无法由 Tomcat Manager 6 启动

linux - CentOS7 中的 VPS,在启动我的 vps 时运行 Files JAVA

c - mremap "initialize"内存是否增长?

linux - 需要使用 mmap() 重复读取寄存器。读取值不更新。我需要重新映射吗?