Вызов
fcntlmmap
Система UNIX предоставляет полезное средство, позволяющее программам совместно использовать память, и, к счастью, оно включено в версию 2.0 и более поздние версии ядра Linux. Функция
mmapВы можете применить то же самое средство для работы с файлами, заставив все содержимое файла на диске выглядеть как массив в памяти. Если файл состоит из записей, которые могут быть описаны структурами на языке С, вы сможете обновлять файл с помощью методов доступа к массиву структур.
Это становится возможным благодаря применению сегментов виртуальной памяти с набором особых прав доступа. Чтение из сегмента и запись в него заставляет операционную систему читать соответствующую часть файла на диске и писать данные в нее.
Функция mmap создает указатель на область памяти, ассоциированную с содержимым файла, доступ к которому осуществляется через открытый дескриптор файла.
<b>#include <sys/mman.h></b><b>void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);</b>Изменить начальную позицию порции данных файла, к которым выполняется обращение через совместно используемый сегмент, можно, передавая параметр
offfildeslenПараметр
addrПараметр
prot□
PROT_READ□
PROT_WRITE□
PROT_EXEC□
PROT_NONEПараметр
flagsТаблица 3.7
| Константа | Описание |
|---|---|
MAP_PRIVATE | Сегмент частный, изменения локальные |
MAP_SHARED | Изменения сегмента переносятся в файл |
MAP_FIXED | Сегмент должен располагаться по заданному адресу addr |
Функция
msync<b>#include <sys/mman.h></b><b>int msync(void *addr, size_t len, int flags);</b>Корректируемая часть сегмента задается передачей начального адреса
addrlenflagsТаблица 3.8
| Константа | Описание |
|---|---|
MS_ASYNC | Выполнять запись асинхронно |
MS_SYNC | Выполнять запись синхронно |
MS_INVALIDATE | Обновить другие отражения этого файла так, чтобы они содержали изменения, внесенные этим вызовом |
Функция
munmap<b>#include <sys/mman.h></b><b>int munmap(void *addr, size_t len);</b>В программе mmap.с из упражнения 3.5 показан файл из структур, которые будут корректироваться с помощью функции
mmapmmapmmap1. Начните с определения структуры
RECORDNRECORDS#include <unistd.h>#include <stdio.h>#include <sys/mman.h>#include <fcntl.h>#include <stdlib.h>typedef struct { int integer; char string[24];} RECORD;#define NRECORDS (100)int main() { RECORD record, *mapped; int i, f; FILE *fp; fp = fopen("records.dat", "w+"); for (i=0; i<NRECORDS; i++) { record.integer = i; sprintf(record.string, "RECORD-%d", i); fwrite(&record, sizeof(record), 1, fp); } fclose(fp);2. Далее измените целое значение записи с 43 на 143 и запишите его в строку 43-й записи.