msync -
синхронизирует
содержимое
файла с его
отображением
в памяти
Standard C library (
libc,
-lc)
#include <sys/mman.h>
int msync(void addr[.length], size_t length, int flags);
Вызов
msync()
сбрасывает
изменения
файла,
который
отображён
в память с
помощью
mmap(2),
обратно в
файловую
систему.
Без
использования
этого
вызова нет
никакой
гарантии,
что
изменения
будут
записаны в
файл до
вызова
munmap(2).
Если быть
точнее, то
на диск
записывается
часть
файла,
начинающаяся
в памяти с
адреса
addr
длиной
length.
В
аргументе
flags должен
быть один
из флагов
MS_ASYNC и
MS_SYNC, а
также
дополнительно
можно
указать
MS_INVALIDATE.
Данные
биты имеют
следующее
значение:
- MS_ASYNC
- Запланировать
обновление,
но вызов
завершается
сразу.
- MS_SYNC
- Запланировать
обновление
и ждать его
завершения.
- MS_INVALIDATE
- Считать
недействительными
другие
отображения
того же
файла (для
того, чтобы
они могли
обновиться
до
достоверных
значений,
которые
запишутся).
On success, zero is returned. On error, -1 is returned, and
errno is set
to indicate the error.
- EBUSY
- В flags
указан MS_INVALIDATE,
но на
указанный
адресный
диапазон
есть
блокировка
в памяти.
- EINVAL
- Значение
addr не
кратно PAGESIZE; в
flags
установлен
любой
другой бит,
отличный
от MS_ASYNC | MS_INVALIDATE | MS_SYNC;
в flags
установлены
сразу MS_SYNC и
MS_ASYNC.
- ENOMEM
- Указанная
память (или
её часть)
не была
отображена.
POSIX.1-2001, POSIX.1-2008.
Этот вызов
появился в
Linux 1.3.21, и в нём
использовалось
EFAULT вместо
ENOMEM.
В Linux 2.4.19 это
было
изменено
на
значение POSIX
ENOMEM.
В системах POSIX,
в которых
доступен
msync(),
значения
_POSIX_MAPPED_FILES и
_POSIX_SYNCHRONIZED_IO,
определённые
в
<unistd.h>,
больше
нуля. (См.
также
sysconf(3).)
Согласно POSIX, в
flags должен
быть
указан или
MS_SYNC, или
MS_ASYNC и
отказ
включить
один из
этих
флагов
вызывает
ошибку в
msync()
на
некоторых
системах.
Однако Linux
позволяет
вызывать
msync() без этих
флагов,
используя
семантику,
которая (в
настоящее
время)
эквивалентна
указанию
MS_ASYNC (начиная
с Linux 2.6.19,
MS_ASYNC,
фактически,
ничего не
делает, так
как ядро
правильно
отслеживает
грязные
страницы и
записывает
их в место
хранения
при
необходимости).
Несмотря
на
поведение
Linux, в
переносимых,
ориентированных
на будущее
приложениях
в
flags должен
быть
указан или
MS_SYNC, или
MS_ASYNC.
mmap(2)
B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128–129 and 389–391.
Русский
перевод
этой
страницы
руководства
был сделан
aereiae <
[email protected]>, Alexey <
[email protected]>, Azamat
Hackimov <
[email protected]>, Dmitriy S. Seregin
<
[email protected]>, Dmitry Bolkhovskikh <
[email protected]>,
ITriskTI <
[email protected]>, Max Is <
[email protected]>, Yuri
Kozlov <
[email protected]>, Иван
Павлов <
[email protected]>
и Малянов
Евгений
Викторович
<
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]