日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
mmap |
ファイル・システム・オブジェクトを仮想メモリにマップします。この関数はリエントラントです。
#include <types.h>関数バリアント mmap関数は,それぞれ 32 ビットと 64 ビットのポインタ・サイズで使用するための _mmap32と _mmap64という名前のバリアントを持っています。ポインタ・サイズ固有の関数の使用方法については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.9 節を参照してください。#include <mman.h>
void mmap (void *addr, size_t len, int prot, int flags, int filedes, off_t off); (X/Open, POSIX-1)
void mmap (void *addr, size_t len, int prot, int flags, int filedes, off_t off ...); (HP C Extension)
addr
新しいリージョンの開始アドレス (ページ境界に設定されなければなりません)。len
新しいリージョンのバイト長。prot
<mman.h>ヘッダ・ファイルに定義されているアクセス許可。 PROT_NONE,PROT_READ,または PROT_WRITE を指定します。flags
以下の任意の組み合わせに対するビット論理和演算の結果として得られる,マップされたリージョンの属性。
- MAP_FILE または MAP_ANONYMOUS
- MAP_VARIABLE または MAP_FIXED
- MAP_SHARED または MAP_PRIVATE
filedes
open関数から返された,新しいマップされたファイル・リージョンにマップしたいファイル。off
バイト数で指定されるオフセット。 off_tデータ型は,64 ビット整数または 32 ビット整数です。 64 ビット・インタフェースでは, 2 GB よりも大きなファイル・サイズを扱うことができます。これは,コンパイル時に _LARGEFILE 機能テスト・マクロを次のように定義することで選択できます。
CC/DEFINE=_LARGEFILE
...
MAP_SHARED の SYS$CRMPSC システム・サービスのための追加のフラグを指定するオプションの整数。 mmap関数のこのオプションの引数 ( HP C 拡張) は, OpenVMS Version 7.2 で導入されました。
mmap関数は,新しいマップされたファイル・リージョン,新しいプライベート・リージョン,または新しい共用メモリ・リージョンを作成します。アプリケーションは, mmapを, read, write,標準入出力などの他のファイル・アクセス方式と組み合わせて使用するときには,同期が正しく行われるように注意する必要があります。
また,呼び出し元のアプリケーションは, mmapを呼び出す前に,範囲 [off, off+len] の中のすべてのバイトがファイルに書き込まれていることを確認しなくてはなりません ( たとえば fsync関数を使用します)。この条件が満たされていないと, mmapは実行に失敗し, errnoを ENXIO (そのようなデバイスまたはアドレスは存在しない) に設定します。
addr および len 引数は,要求された開始アドレスと長さを,新しいリージョンのバイト数として指定します。アドレスは, sysconf(_SC_PAGE_SIZE)から返されるページ・サイズの倍数です。
len 引数が sysconf(_SC_PAGE_SIZE)から返されるページ・サイズの倍数でなかった場合,リージョンの終端と,リージョンの終端を含んでいるページの終端の間のアドレスに対するすべての参照の結果は未定義となります。
flags 引数は,マップされたリージョンの属性を指定します。 flags の値は, <mman.h>ヘッダ・ファイルに定義されている次のシンボリック名のリストのフラグのビット論理和演算によって作成されます。
MAP_FILE マップされたファイル・リージョンを作成する。 MAP_ANONYMOUS 名前なしのメモリ・リージョンを作成する。 MAP_VARIABLE リージョンを計算されたアドレスに配置する。 MAP_FIXED リージョンを固定されたアドレスに配置する。 MAP_SHARED 変更点を共用する。 MAP_PRIVATE 変更点はプライベートである。
MAP_FILE および MAP_ANONYMOUS フラグは,マップしようとしているリージョンがマップされたファイル・リージョンなのか,匿名の共用メモリ・リージョンなのかを制御します。いずれかのフラグが選択されている必要があります。
flags 引数の中で MAP_FILE が設定されている場合:
- 新しいマップされたファイル・リージョンが作成され, filedes 引数に関連付けられたファイルがマッピングされる。
- off 引数は,マッピングが開始されるファイル・バイト・オフセットを指定する。このオフセットは, sysconf(_SC_PAGE_SIZE)から返されるページ・サイズの倍数でなくてはならない。
- マップされたファイル・リージョンの終端がファイルの終端よりも後にある場合,ファイルの終端を越えたオフセットに対応するマップされたファイル・リージョンの中のアドレスへのすべての参照の結果は不定となる。
flags 引数の中で MAP_ANONYMOUS が設定されている場合:
- 新しいメモリ・リージョンが作成され,すべてゼロに初期化される。
- filedes 引数は無視される。
要求されたアドレスが null でなく,リージョンをこのアドレスに置くことが可能であれば,新しいリージョンは要求されたアドレスに配置されます。要求されたアドレスが null であるか,要求されたアドレスにリージョンを置くことができない場合には, MAP_VARIABLE および MAP_FIXED フラグがリージョンの配置を制御します。いずれかのフラグが選択されている必要があります。
flags 引数の中で MAP_VARIABLE が設定されている場合:
- 要求されたアドレスが null であるか,システムがリージョンを要求されたアドレスに置くことができない場合,リージョンはシステムによって選択されたアドレスに配置される。
flags 引数の中で MAP_FIXED が設定されている場合:
- 要求されたアドレスが null でない場合, mmap関数は,要求されたアドレスがすでに他のリージョンの一部であっても実行に成功する ( アドレスが既存のリージョン内にある場合,そのリージョン内のページと, 2 つのリージョンがオーバラップする領域内のページに対する効果は,それらがアンマップされた場合と同じになる。言い換えると,addr と addr + len の間でマップされているものはすべてアンマップされる )。
- 要求されたアドレスが null で, MAP_FIXED が指定されている場合の結果は未定義である。
MAP_PRIVATE および MAP_SHARED フラグは,マップされたファイルまたは共用メモリ・リージョンに対する変更の可視性を制御します。いずれかのフラグが選択されている必要があります。
flags 引数の中で MAP_SHARED が設定されている場合:
- リージョンがマップされたリージョンである場合,リージョンに対する変更は, MAP_SHARED を使って同じリージョンをマップしている他のプロセスから見える。
- リージョンがマップされたファイル・リージョンである場合,リージョンに対する変更はファイルに書き込まれる ( バッファ・キャッシュの遅れのために,変更はただちにファイルに書き込まれるわけではないことに注意すること。つまり,ファイルへの書き込みは,バッファ・キャッシュを再利用する必要が生じるまでは行われない。変更をただちにファイルに書き込む必要がある場合には, msync関数を使用する )。
flags 引数の中で MAP_PRIVATE が設定されている場合:
- 呼び出し元プロセスがマップされたリージョンに加えた変更は, MAP_PRIVATE または MAP_SHARED を使って同じリージョンをマップしている他のプロセスからは見えない。
- 呼び出し元プロセスがマップされたリージョンに加えた変更は,ファイルには書き込まれない。
リージョンを MAP_SHARED を使ってマップしたプロセスによって加えられた変更が,同じリージョンを MAP_PRIVATE を使ってマップしている他のプロセスから見えるかどうかは定められていません。
prot 引数は,マップされたリージョンに対するアクセス許可を指定します。以下のいずれかを指定します。
PROT_NONE アクセスなし PROT_READ 読み込み専用 PROT_WRITE 読み書きアクセス
mmap関数が実行に成功したら,filedes 引数は,マップされたリージョンやマップされたファイルの内容に影響を与えずにクローズすることができます。個々のマップされたリージョンは,オープン・ファイル記述子に似たファイル参照を作成し,ファイル・データが割り当て解除されるのを防ぎます。
注意
OpenVMS 固有のファイル参照には,以下の規則が適用されます。
- 追加のファイル参照のために, filedes がファイルの共用を指定してオープンされていなかった場合, mmapはファイル共用を有効にしてファイルを再オープンする。
- マップされたリージョンに対してファイル参照が追加されている場合,マップされているファイルに対するそれ以降の open, fopen,または create呼び出しは,ファイル共用を指定しなくてはならない。
write関数を使って行われるファイルの変更は,マップされたリージョンから見ることができ,マップされたリージョンに対する変更は, read関数で見ることができます。
注意
OpenVMS Version 7.2 およびそれ以降の mmap関数は, MAP_SHARED 要求を処理する際に,SYS$CRMPSC サービスの flags 引数を, MAP_SHARED 要求を処理するために自分で設定したビットと,呼び出し元がオプションの引数で指定したビットのビット論理和として作成します。デフォルトでは, mmap関数は MAP_SHARED のために一時的なグループ・グローバル・セクションを作成します。オプションの mmap引数は,呼び出し元に対し, SYS$CRMPSC システム・サービスの機能への直接のアクセスを提供します。
呼び出し元は,オプションの引数を使用することで,システム・グローバル・セクション (SEC$M_SYSGBL ビット) や永久的グローバル・セクション (SEC$M_PERM ビット) などを作成することができます。たとえば,システム永久的グローバル・セクションを作成するには,呼び出し元はオプションの引数で (SEC$M_SYSGBL | SEC$M_PERM) を指定します。
mmap関数は,特権のチェックや設定は行いません。呼び出し元は, mmapをオプションの引数を付けて呼び出す前に, SEC$M_SYSGBL には SYSGBL,SEC$M_PERM には PRMGBL などの適切な特権を設定する責任を負います。
read, write, open, fopen, creat, および sysconfも参照してください。
x マッピングが配置されるアドレス。 MAP_FAILED エラーを示します。 errno は以下のいずれかの値に設定されます。
- EACCES--- filedes が参照するファイルが読み込みアクセス用にオープンされていないか,ファイルが書き込みアクセス用にオープンされておらず, MAP_SHARED マッピング操作で PROT_WRITE が設定されていた。
- EBADF--- filedes 引数は有効なファイル記述子でない。
- EINVAL--- flags あるいは prot 引数が無効である,または, addr あるいは off 引数が sysconf(_SC_PAGE_SIZE) から返されるページ・サイズの倍数でない。または, flags で MAP_ANONYMOUS が指定されており, filedes が - 1 でない。
- ENODEV---ファイル記述子 filedes は,ターミナルなどのマップ不可能なオブジェクトを参照している。
- ENOMEM--- len バイトをマップするのに十分なアドレス空間がない。
- ENXIO---範囲 [ off, off + len] で指定されたアドレスは, filedes では無効である。
- EFAULT--- addr 引数は無効なアドレスである。
目次 | 索引 |
|