TEDIA会員に登録したメールアドレスとパスワードを入力してください

メールアドレス:

     パスワード:


パスワードを忘れた方はパスワードの確認を行ってください。

TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます


>> テクノロジーポータル TEDIA トップページへ戻る <<

Think IT Software Developer's Think IT Find-IT 失敗しないソフト選び Find-IT TEDIA テクノロジーポータル TEDIA インストールマニアックス2008 インストールマニアックス2008

TEDIA SponsorsOpen 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
 要求の実行に必要なメモリーがカーネルにありません。あるいは、指定されたメモリ領域にある単数あるいは複数のページが、プロセスのアドレス空間の有効な部分ではありません。


前のページ     1    2    3    4    5    次のページ

Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.