Mmap() целый большой файл

Я пытаюсь "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 и файла возвращаемых тестов: тест: ELF 64-битный исполняемый файл LSB, x86-64, версия 1 (SYSV), динамически связанный (использует разделяемые libs), для GNU/Linux 2.6.15, не удаляется

Хотя для маленьких файлов это работает нормально, я получаю ошибку сегментации, когда пытаюсь загрузить большой файл. На самом деле программа возвращает:

Size: 8274324021 
mmap: Cannot allocate memory

Мне удалось сопоставить весь файл с помощью boost::iostreams::mapped_file, но я хочу сделать это с помощью C и системных вызовов. Что не так с моим кодом?

64
задан JL2210 28 March 2019 в 20:09
поделиться