Я пытаюсь выполнить «mmap» двоичного файла (~ 8 ГБ), используя следующий код (test.c).
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
int main(int argc, char *argv[])
{
const char *memblock;
int fd;
struct stat sb;
fd = open(argv[1], O_RDONLY);
fstat(fd, &sb);
printf("Size: %lu\n", (uint64_t)sb.st_size);
memblock = mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, fd, 0);
if (memblock == MAP_FAILED) handle_error("mmap");
for(uint64_t i = 0; i < 10; i++)
{
printf("[%lu]=%X ", i, memblock[i]);
}
printf("\n");
return 0;
}
test.c компилируется с использованием gcc -std=c99 test.c -o test
и file
результатов теста: test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
Хотя это нормально работает для небольших файлов, я получаю ошибку сегментации, когда пытаюсь загрузить большой. Программа фактически возвращает:
Size: 8274324021
mmap: Cannot allocate memory
Мне удалось отобразить весь файл с помощью boost :: iostreams :: mapped_file, но я хочу сделать это с помощью C и системных вызовов. Что не так с моим кодом?
O_LARGEFILE
. проверьте руководство. не уверен, что ›файлы размером 4 ГБ можноmmap
редактировать. - person phoxis   schedule 28.08.2011x86_64
- person phoxis   schedule 28.08.2011ulimit -v
установлен слишком низким для объема памяти, который вы запрашиваете, независимо от того, сколько памяти / свопа у вас есть. - person Chris Dodd   schedule 28.08.2011strace
, чтобы проверить, не наткнулись ли вы на ENOMEM? - person susmits   schedule 29.08.2011