mprotect() - メモリー・マッピングの保護の設定

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3
z/OS®UNIX

両方  

形式

#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/mman.h>

int mprotect(void *addr, size_t len, int prot);

機能説明

mprotect() 関数は、sysconf() で戻されたページ・サイズの次の倍数までの、len により指定されたマッピングに関するアクセス保護を、prot で指定されたものに変更します。prot に許可される値は、mprotect() に許可される値と同じであり、以下のような <sys.mman.h> 形式で定義されます。
PROT_READ
ページを読み取ることができる。
PROT_WRITE
ページに書き込むことができる。
PROT_EXEC
ページを実行することができる。
PROT_NONE
ページにアクセスできない。

Map_address と Map_length で指定されている範囲には、通常マップだけでなく、__MAP_MEGA マップも入ります。mprotect の __MAP_MEGA マップに及ぼす影響は、通常マップと比べてかなり異なります。異なるのは、変更の有効範囲です。__MAP_MEGA マップを変更すると、指定された範囲内のページが表す ファイル・オフセット範囲へ現在マップされているすべてのプロセスが、その変更の影響を 受けます。例えば、現在書き込み保護で使用されているファイル・オフセット範囲 (ストレージ・ページ) を読み取り保護に変更すると、現行プロセスだけでなくすべてのプロセスに、ファイル・オフセット範囲読み取りが適用されます。つまり、変更はグローバルになります。一方、通常マップへの変更は、mprotect を発行したプロセスだけに影響します。

mprotect() が EINVAL 以外の理由で失敗した場合は、[addr, addr + len) の範囲の ページの一部の保護が変更されている可能性があります。

戻り値

正常に実行された場合、mprotect() は 0 を戻します。

正常に実行されなかった場合、mprotect() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
prot 引数は、プロセスが 基礎メモリー・オブジェクトに対して持っている アクセス許可に違反する保護を指定しました。
EAGAIN
prot 引数が MAP_PRIVATE マッピングに ついて PROT_WRITE を指定しています。そして、専用ページの ロック用に予約するメモリー・リソースが不足しています。
EINVAL
addr 引数が、sysconf() の戻すページ・サイズの倍数になっていません。
ENOMEM
[addr, addr + len) の範囲の アドレスが、プロセスのアドレス・スペースで無効です。あるいは、このアドレスが 1 つ以上のページを 指定しています。

関連情報