Scroll to navigation

MSYNC(2) Linux Programmer's Manual MSYNC(2)

名前

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:

Specifies that an update be scheduled, but the call returns immediately.
Requests an update and waits for it to complete.
Asks to invalidate other mappings of the same file (so that they can be updated with the fresh values just written).

返り値

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

エラー

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

準拠

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

2020-06-09 Linux