Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

 /* Удваиваем число и записываем его обратно в файл. */

 sprintf((char*)file_memory, "%d\n", 2 * integer);

 /* Освобождение памяти (не обязательно, так как программа

завершается). */

 munmap(file_memory, FILE_LENGTH);

 return 0;

}

Программа

mmap-read
читает число из файла, а затем удваивает его и записывает обратно в файл. Сначала файл открывается для чтения/записи. Поскольку предполагается, что файл содержит число, проверка с помощью функции
lseek
, как в предыдущей программе, не требуется. Чтение содержимого памяти и его анализ выполняет функция
lseek
. Функция
sprintf
форматирует число и записывает его в память.

Ниже показан пример запуска обеих программ. Им на вход передается файл

/tmp/integer-file
.

% ./mmap-write /tmp/integer-file

% cat /tmp/integer-file

42

% ./mmap-read /tmp/integer-file

value: 42

% cat /tmp/integer-file

84

Обратите внимание: значение 42 оказалось записано в файл на диске, хотя функция

write
не вызывалась. Последующее чтение файла осуществлялось без функции
read
. Целое число записывалось в файл и извлекалось из него в текстовом виде (с помощью функций
sprintf
и
sscanf
). Это сделано исключительно в демонстрационных целях. В действительности отображаемый файл может содержать не только текст, но и двоичные данные.

5.3.3. Совместный доступ к файлу

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

mmap
указать флаг
MAP_SHARED
, все данные, заносимые в отображаемую память, будут немедленно записываться в файл, т.е. становиться видимыми другим процессам. При отсутствии этого флага ОС Linux может осуществлять предварительную буферизацию записываемых данных.

С другой стороны, с помощью функции

msync
можно заставить операционную систему перенести содержимое буфера в дисковый файл. Первые два параметра этой функции такие же, как и в функции
munmap
. Третий параметр может содержать следующие флаги.

■ 

MS_ASYNC
. Операция обновления ставится в очередь планировщика и будет выполнена, но не обязательно до того, как функция завершится.

■ 

MS_SYNC
. Операция обновления выполняется немедленно. До ее завершения функция блокируется. Флаги
MS_ASYNC
и
MS_SYNC
нельзя указывать одновременно.

■ 

MS_INVALIDATE
. Все остальные отображаемые области помечаются как недействительные и подлежащие обновлению.

Следующая функция обновляет файл, область отображения которого начинается с адреса

mem_addr
и имеет длину
mem_length
:

msync(mem_addr, mem_length, MS_SYNC | MS_INVALIDATE);

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

fcntl
и поставить на файл блокировку чтения или записи (об этом рассказывается в разделе 8.3, "Функция fcntl: блокировки и другие операции над файлами").

5.3.4. Частные отображаемые области

Если в функции

mmap
указан флаг
MAP_PRIVATE
, отображаемая область создается в режиме "копирование при записи". Любые операции записи в эту область имеют эффект только в адресном пространстве текущего процесса. Другие процессы, связанные с тем же самым отображаемым файлом, не узнают об изменениях. Изменения заносятся не на страницу, доступную всем процессам, а в частную копию этой страницы. Все последующие операции чтения и записи в данном процессе будут выполняться по отношению к этой копии.

5.3.5. Применения функции mmap

Функция

mmap
может использоваться не только для организации взаимодействия процессов. Часто она выступает в качестве замены функциям
read
и
write
. Например, вместо того чтобы непосредственно загружать содержимое файла в память, программа может связать файл с отображаемой памятью и сканировать его путем обращения к памяти. Иногда это удобнее и быстрее, чем выполнять операции файлового ввода-вывода.

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

Другой удобный прием — отображение в памяти файла

/dev/zero
(описывается в разделе 6.5.2, "/dev/zero"). Этот файл ведет себя так, как будто содержит бесконечное число нулевых байтов. Операции записи в него игнорируются. Описываемый прием часто применяется в пользовательских функциях выделения памяти, которым необходимо инициализировать блоки памяти.

  • Читать дальше
  • 1
  • ...
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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