ОБЗОР
#include <sys/mman.h>
int msync(void *addr, 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 Считать недействительными другие отображения того же файла (для того, чтобы они могли обновиться до достоверных значений, которые запишутся).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а
errno устанавливается в соответствующее значение.
ОШИБКИ
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.