標準
標準/拡張機能 |
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 つ以上のページを
指定しています。