Доступ к двоичным файлам с помощью mmap против fstream или fopen - PullRequest
0 голосов
/ 05 мая 2019

Я не знал, что двоичные файлы могут быть прочитаны с mmap().Раньше я думал, что mmap() может использоваться только для IPC (межпроцессное взаимодействие) в Linux для обмена данными между несвязанными процессами.

Может кто-нибудь объяснить, как файлы читаются с mmap()?Я слышал, что это имеет огромное преимущество при случайном доступе к двоичным файлам.

1 Ответ

2 голосов
/ 05 мая 2019

Ну, mmap ping файл выполняется так же, как это делается для IPC или сопоставления анонимной памяти.В случае сопоставления анонимной памяти части, которые не были записаны, будут заполнены нулями страниц по требованию.

В случае сопоставленного файла страницы, которые соответствуют содержимому файла, читаются при доступе (ипосле записи тоже) из файла / или буферного кеша.Чтение или запись вне размера файла приведет к SIGBUS .По существу, указатель, возвращаемый mmap, может рассматриваться аналогично указателю, возвращаемому malloc, за исключением того, что до размера отображения / до байтов конца файла в отображении автоматически считываются из /и, возможно, прозрачно записывается в файл поддержки.

Пример:

fd = open("input.txt", O_RDWR, 0666);
fstat(fd, &stat_result); 
char* contents = mmap(0, stat_result->st_size,
                      PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

(проверка ошибок пропущена)

После выполнения этого вы можете считать contents указанием напервый байт символьного массива stat_result->st_size символов, и вы можете использовать его как обычный массив, и операционная система будет прозрачно записывать изменения в файл.


С mmapоперационная система будет лучше понимать, какие части файла должны храниться в кеше памяти / буфера, а какие нет.

...