msync(2) ファイルをマップしたメモリと同期させる

書式

#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_ASYNCMS_SYNC を同時に指定することはできない。 MS_ASYNC は更新を予定に組み込むことを表し、呼び出しは直ちに返る。 MS_SYNC は更新を要求し、更新が完了するまで待つ。 MS_INVALIDATE は(たった今書き込んだ新しい値でマッピングを更新することができるように) 同じファイルに対する他のマッピングを無効にすることを要求する。

返り値

成功した場合、 0 が返る。エラーの場合、 -1 が返り、 errno が適切に設定される。

エラー

EBUSY
I flags に MS_INVALIDATE が指定されたが、指定されたアドレス範囲にロックが存在する。
EINVAL
addr が PAGESIZE の倍数でない。または、 flagsMS_ASYNCMS_INVALIDATEMS_SYNC 以外のビットが設定された。 または、 flagsMS_SYNCMS_ASYNC の両方が設定された。
ENOMEM
指定されたメモリ (またはその一部) がマップされていない。

準拠

POSIX.1-2001.

この関数は Linux 1.3.21 で導入されたが、 ENOMEM ではなく EFAULT が使われていた。 これは Linux 2.4.19 で POSIX における値 ENOMEM に変更された。

可用性

msync() が使用可能な POSIX システムでは _POSIX_MAPPED_FILES_POSIX_SYNCHRONIZED_IO の両方が <unistd.h> で 0 より大きい値に定義される。 (sysconf(3) を参照すること。 )

注意

POSIX では MS_SYNCMS_ASYNC のいずれかは必ず flags に指定しなければならないとされており、 実際にこれらのフラグのいずれかを指定しなかった場合 msync() が失敗するシステムもある。 しかし、 Linux ではこれらのフラグのいずれも指定せずに msync() を呼び出すことができ、 その場合の動作は (現在のところ) MS_ASYNC を指定した場合と等価である。 (Linux 2.6.19 以降では MS_ASYNC は実際には no-op (何もしない命令) である。 これはカーネルが正しく dirty ページを追跡し、必要に応じてストレージにそれらをフラッシュするからである。) Linux の動作に関係なく、アプリケーションの移植性を考慮し、将来も確実に動くようにするには、 MS_SYNCMS_ASYNC のいずれかを必ず flags に指定するようにすべきである。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。