msync -
ファイルをマップしたメモリーと同期させる
#include <sys/mman.h>
int msync(void *addr, size_t length, int
flags );
msync() は
mmap(2)
を使ってメモリーにマップされたファイルの、
メモリー上のコピーになされた変更をファイルシステムに反映させる。
この関数を使用しないと、
munmap(2)
が呼び出されるまで変更が書き戻される保証はない。
より正確には、ファイルのうち
addr から始まり長さ
length
のメモリー領域に対応する部分が更新される。
The
flags argument should specify exactly one of
MS_ASYNC and
MS_SYNC, and may additionally include the
MS_INVALIDATE bit.
These bits have the following meanings:
- MS_ASYNC
- Specifies that an update be scheduled, but the call returns
immediately.
- MS_SYNC
- Requests an update and waits for it to complete.
- MS_INVALIDATE
- Asks to invalidate other mappings of the same file (so that
they can be updated with the fresh values just written).
成功した場合、 0
が返る。エラーの場合、
-1 が返り、
errno
が適切に設定される。
- EBUSY
- I 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
で導入されたが、
ENOMEM
ではなく
EFAULT
が使われていた。
これは Linux 2.4.19 で POSIX
における値
ENOMEM
に変更された。
msync() が使用可能な POSIX
システムでは
_POSIX_MAPPED_FILES
と
_POSIX_SYNCHRONIZED_IO の両方が
<unistd.h> で 0
より大きい値に定義される。
(
sysconf(3)
を参照すること。 )
POSIX では
MS_SYNC と
MS_ASYNC
のいずれかは必ず
flags
に指定しなければならないとされており、
実際にこれらのフラグのいずれかを指定しなかった場合
msync()
が失敗するシステムもある。
しかし、 Linux
ではこれらのフラグのいずれも指定せずに
msync()
を呼び出すことができ、
その場合の動作は
(現在のところ)
MS_ASYNC
を指定した場合と等価である。
(Linux 2.6.19 以降では
MS_ASYNC
は実際には no-op
(何もしない命令)
である。
これはカーネルが正しく
dirty
ページを追跡し、必要に応じてストレージにそれらをフラッシュするからである。)
Linux
の動作に関係なく、アプリケーションの移植性を考慮し、将来も確実に動くようにするには、
MS_SYNC か
MS_ASYNC
のいずれかを必ず
flags
に指定するようにすべきである。
mmap(2)
B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128–129 and 389–391.
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。