<p>mmap (от англ. memory map) — это механизм в языке программирования C, позволяющий отобразить физическую память компьютера в виртуальное адресное пространство процесса. Он предоставляет доступ к физическим данным, таким как файлы, устройства или разделяемая память, как если бы они были обычными массивами в памяти.</p>
<p>Для работы с mmap в C вам потребуется подключить заголовочный файл <sys/mman.h>.</p>
<p>Приведу пример использования mmap на создание и отображение файла в памяти:</p>
<pre class="hljs"><code class="language-c">
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
int main() {
int fd;
char *mapped;
struct stat file_stat;
const char *file_path = "/path/to/file.txt";
// Открываем файл для чтения и записи
fd = open(file_path, O_RDWR, (mode_t)0600);
if (fd == -1) {
perror("Ошибка открытия файла");
exit(EXIT_FAILURE);
}
// Получаем информацию о файле
if (fstat(fd, &file_stat) == -1) {
perror("Ошибка получения информации о файле");
close(fd);
exit(EXIT_FAILURE);
}
// Отображаем файл в память
mapped = mmap(NULL, file_stat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (mapped == MAP_FAILED) {
perror("Ошибка отображения файла в память");
close(fd);
exit(EXIT_FAILURE);
}
// Используем отображенный файл как обычный массив в памяти
// Например, выводим содержимое файла на экран
printf("Содержимое файла:\n%s\n", mapped);
// Изменяем содержимое файла
// Например, меняем первый символ на 'X'
mapped[0] = 'X';
// Сохраняем изменения обратно в файл
if (msync(mapped, file_stat.st_size, MS_SYNC) == -1) {
perror("Ошибка сохранения изменений");
munmap(mapped, file_stat.st_size);
close(fd);
exit(EXIT_FAILURE);
}
// Освобождаем отображение и закрываем файл
if (munmap(mapped, file_stat.st_size) == -1) {
perror("Ошибка освобождения отображения");
close(fd);
exit(EXIT_FAILURE);
}
close(fd);
return 0;
}
</code></pre>
<p>В данном примере мы открываем файл для чтения и записи с помощью функции <code>open()</code>. Затем, с помощью функции <code>fstat()</code> получаем информацию о файле, включая его размер.
Далее, с помощью функции <code>mmap()</code> мы отображаем файл в память с помощью указателя <code>mapped</code>. Указатель, полученный от функции <code>mmap()</code>, позволяет обращаться к данным файла как к обычному массиву в памяти.
Мы можем изменять содержимое файла, используя операции записи на указатель <code>mapped</code>. В данном примере к примеру, мы меняем первый символ файла на символ 'X'.
Чтобы сохранить изменения обратно в файл, мы используем функцию <code>msync()</code>. Это гарантирует, что все изменения, сделанные в отображенном файле, будут сохранены в физической памяти.
Наконец, мы освобождаем отображение файла с помощью функции <code>munmap()</code> и закрываем файл с помощью функции <code>close()</code>.</p>
<p>Таким образом, mmap предоставляет мощный механизм для работы с физическими данными в памяти компьютера, отображая их в виртуальное адресное пространство процесса. Это особенно полезно при работе с большими файлами или при необходимости обмениваться данными между процессами.</p>