Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Функция mmap создает указатель на область памяти, ассоциированную с содержимым файла, доступ к которому осуществляется через открытый дескриптор файла.

#include <sys/mman.h>

void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);

Изменить начальную позицию порции данных файла, к которым выполняется обращение через совместно используемый сегмент, можно, передавая параметр

off
. Открытый дескриптор файла задается в параметре
fildes
. Объем данных, к которым возможен доступ (т. е. размер сегмента памяти), указывается в параметре
len
.

Параметр

addr
можно использовать для запроса конкретного адреса памяти. Если он равен нулю, результирующий указатель формируется автоматически. Последний вариант рекомендуется, потому что в противном случае трудно добиться переносимости; диапазоны доступных адресов в разных системах отличаются.

Параметр

prot
используется для установки прав доступа к сегменту памяти. Он представляет собой результат поразрядной операции or, примененной к следующим константам:

PROT_READ
— сегмент может читаться;

PROT_WRITE
— в сегмент можно писать;

PROT_EXEC
— сегмент может выполняться;

PROT_NONE
— к сегменту нет доступа.

Параметр

flags
контролирует, как изменения, сделанные программой в сегменте, отражаются в других местах; его возможные значения приведены в табл. 3.7.

Таблица 3.7

Константа Описание
MAP_PRIVATE
Сегмент частный, изменения локальные
MAP_SHARED
Изменения сегмента переносятся в файл
MAP_FIXED
Сегмент должен располагаться по заданному адресу
addr

Функция

msync
вызывает запись изменений в части или во всем сегменте памяти обратно а отображенный файл (или считывание из файла).

#include <sys/mman.h>

int msync(void *addr, size_t len, int flags);

Корректируемая часть сегмента задается передачей начального адреса

addr
и размера
len
. Параметр
flags
управляет способом выполнения корректировки с помощью вариантов, приведенных в табл. 3.8.

Таблица 3.8

Константа Описание
MS_ASYNC
Выполнять запись асинхронно
MS_SYNC
Выполнять запись синхронно
MS_INVALIDATE
Обновить другие отражения этого файла так, чтобы они содержали изменения, внесенные этим вызовом

Функция

munmap
освобождает сегмент памяти.

#include <sys/mman.h>

int munmap(void *addr, size_t len);

В программе mmap.с из упражнения 3.5 показан файл из структур, которые будут корректироваться с помощью функции

mmap
и обращений в стиле массива. Ядро Linux версий, меньших 2.0, не полностью поддерживает применение функции
mmap
. Программа работает корректно в системе Sun Solaris и других системах.

Упражнение 3.5. Применение функции
mmap

1. Начните с определения структуры

RECORD
и создайте
NRECORDS
вариантов, в каждый из которых записывается собственный номер. Они будут добавлены в конец файла records.dat.

#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-й записи.

 fp = fopen("records.dat", "r+");

 fseek(fp, 43*sizeof(record), SEEK_SET);

 fread(&record, sizeof(record), 1, fp);

 record.integer =143;

 sprintf(record.string, "RECORD-%d", record.integer);

 fseek(fp, 43*sizeof(record), SEEK_SET);

 fwrite(&record, sizeof(record), 1, fp);

 fclose(fp);

3. Теперь отобразите записи в память и обратитесь к 43-й записи для того, чтобы изменить целое на 243 (и обновить строку записи), снова используя отображение в память.

 f = open("records.dat", O_RDWR);

 mapped = (RECORD *)mmap(0, NRECORDS*sizeof(record),

PROT_READ|PROT_WRITE, MAP_SHARED, f, 0);

Поделиться:
Популярные книги

Хозяин оков VI

Матисов Павел
6. Хозяин Оков
Фантастика:
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Хозяин оков VI

Защитник

Кораблев Родион
11. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Защитник

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Локки 9. Потомок бога

Решетов Евгений Валерьевич
9. Локки
Фантастика:
фэнтези
попаданцы
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 9. Потомок бога

Последний Герой. Том 5

Дамиров Рафаэль
5. Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 5

Изгой Проклятого Клана

Пламенев Владимир
1. Изгой
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Изгой Проклятого Клана

Слезы Эйдена 1

Владимиров Денис
11. Глэрд
Фантастика:
боевая фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Слезы Эйдена 1

Старший лейтенант, парень боевой!

Зот Бакалавр
8. Героями не становятся, ими умирают
Фантастика:
боевая фантастика
5.00
рейтинг книги
Старший лейтенант, парень боевой!

Сын Тишайшего 3

Яманов Александр
3. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Сын Тишайшего 3

Страж Кодекса. Книга III

Романов Илья Николаевич
3. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Страж Кодекса. Книга III

Держать удар

Иванов Дмитрий
11. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Держать удар

Первый среди равных. Книга IV

Бор Жорж
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IV

На границе империй. Том 10. Часть 2

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 2

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение