Работаем с файлами в оперативной памяти с помощью mmap
mmap (от англ. Memory Mapped File) - это механизм операционной системы Linux, который позволяет связать область виртуальной памяти процесса с файлом на диске или устройством ввода-вывода блокового типа.
Для использования mmap необходимо сначала открыть файл с помощью системного вызова open(), указав флаги O_RDONLY, O_WRONLY или O_RDWR для открытия файла на чтение, запись или чтение и запись соответственно. Далее следует указать размер области памяти, которую необходимо отобразить в файле, с помощью системного вызова fstat(), чтобы получить информацию о размере файла. Затем с помощью системного вызова mmap() можно создать отображение файла на виртуальную память процесса.
Пример использования mmap для чтения содержимого файла:
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(EXIT_FAILURE);
}
int fd = open(argv[1], O_RDONLY);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
struct stat sb;
if (fstat(fd, &sb) == -1) {
perror("fstat");
exit(EXIT_FAILURE);
}
char *file_content = (char *) mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (file_content == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
// Теперь содержимое файла доступно через указатель file_content
for (int i = 0; i < sb.st_size; i++) {
putchar(file_content[i]);
}
munmap(file_content, sb.st_size);
return 0;
}
Этот пример открывает файл, получает его размер и создает отображение файла в памяти процесса с помощью mmap. Наконец, содержимое файла выводится на экран с помощью функции putchar(). В конце программы используется функция munmap() для освобождения ресурсов.
Пример использования mmap для записи в файл:
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(EXIT_FAILURE);
}
int fd = open(argv[1], O_RDWR | O_CREAT, (mode_t) 0600);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
const size_t FILESIZE = sizeof(int);
int *file_content = (int *) mmap(NULL, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (file_content == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
*file_content = 42;
munmap(file_content, FILESIZE);
close(fd);
return 0;
}
Этот пример создает новый файл и отображает его содержимое в память процесса с помощью mmap. Затем в отображенный участок памяти записывается число 42. В конце программы используется функция munmap() для освобождения ресурсов и функция close() для закрытия файла.