Open Source Web Development Tutorials - Dev Shed
mmap()を利用する高度なファイルI/O
(2009/03/18公開)
マッピング保護の変更
POSIXは、以下のように、mprotect()インターフェースの定義によって、既存のメモリ領域に対する許可を変更します。
#include <sys/mman.h>
int mprotect (const void *addr,
size_t len,
int prot);
mprotect()のコールは、[addr,addr+len)に含まれているメモリ・ページに対して、保護モードを変更します。この場合、addrはページ境界に合っています。Protパラメータはmmap()に与えたprotと同じ値、すなわちPROT_NONE、PROT_READ、PROT_WRITE、PROT_EXECです。これらの値は追加式ではありません。したがって、メモリ領域が読み出し可能でも、protがPROT_WRITEのみに設定されていれば、コールの結果、そのメモリ領域には書き込みだけが可能となります。
システムによっては、mmap()で作成したメモリ・マッピングでないとmprotect()が動作しない場合があります。Linuxでは、あらゆるメモリ領域を対象としてmprotect()が動作します。
mprotect()が成功すると0が戻ります。失敗したときは-1が戻り、errnoが以下のいずれかを示します。
EACCESS
メモリに対して、protで要求された許可を与えることはできません。例えば、読み出し専用で開いたファイルのマッピングを書き込み可能に変更しようとしたとき、このエラーが発生します。
EINVAL
addrパラメータが無効です。あるいは、ページ境界に合っていません。
ENOMEM
要求の実行に必要なメモリーがカーネルにありません。あるいは、指定されたメモリ領域にある単数あるいは複数のページが、プロセスのアドレス空間の有効な部分ではありません。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








