Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Вызов
fcntl
mmap
Система 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>
Изменить начальную позицию порции данных файла, к которым выполняется обращение через совместно используемый сегмент, можно, передавая параметр
off
fildes
len
Параметр
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>
Корректируемая часть сегмента задается передачей начального адреса
addr
len
flags
Таблица 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 показан файл из структур, которые будут корректироваться с помощью функции
mmap
mmap
mmap
1. Начните с определения структуры
RECORD
NRECORDS
#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-й записи.