在 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_NORESERVE
与 MAP_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/