sscanf(file_memory, "%d", &integer);
printf("value: %d\n", integer);
/* Удваиваем число и записываем его обратно в файл. */
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()
5.3.4. Частные отображаемые области
Если в функции mmap()
MAP_PRIVATE
, отображаемая область создается в режиме "копирование при записи". Любые операции записи в эту область имеют эффект только в адресном пространстве текущего процесса. Другие процессы, связанные с тем же самым отображаемым файлом, не узнают об изменениях. Изменения заносятся не на страницу, доступную всем процессам, а в частную копию этой страницы. Все последующие операции чтения и записи в данном процессе будут выполняться по отношению к этой копии.5.3.5. Применения функции mmap()
Функция mmap()
read()
и write()
. Например, вместо того чтобы непосредственно загружать содержимое файла в память, программа может связать файл с отображаемой памятью и сканировать его путем обращения к памяти. Иногда это удобнее и быстрее, чем выполнять операции файлового ввода-вывода.