前へ | 次へ | 目次 | 索引 |
モード引数と, umaskによって設定されたファイル保護マスクの組み合わせから得られるファイル保護は,(0444) & ~(0000),すなわち 0444 です。この保護に親ディレクトリのデフォルト値が適用されると,新しいディレクトリの保護は次のようになります。
File protection: System:RW, Owner:RW, Group:RW, World:RW |
削除アクセスは継承されないことに注意してください。
一意のファイル名を作成します。
#include <stdlib.h>int mkstemp (char *template);
template
一意のファイル名に置き換えられる文字列へのポインタ。 template 引数の中の文字列は,末尾に 6 つの X を含んだファイル名でなくてはなりません。
mkstemp関数は,template がポイントする文字列の末尾の 6 つの X を一意の文字のセットに置き換え,読み書き用にオープンされたファイルのファイル記述子を返します。template がポイントする文字列は,末尾に 6 つの X を含んだファイル名の形になっていなくてはなりません。 mkstemp関数は,既存のファイル名との重複が起こらないように,個々の X を移植性のあるファイル名文字セットの文字に置き換えます。
template がポイントする文字列が,末尾に 6 つの X を含んでいない場合には, - 1 が返されます。
x オープンされたファイル記述子。 - 1 エラーを示します ( template がポイントする文字列は,末尾に 6 つの X を含んでいません)。
テンプレートから一意のファイル名を作成します。
#include <stdlib.h>関数バリアント mktemp関数は,それぞれ 32 ビットと 64 ビットのポインタ・サイズで使用するための _mktemp32と _mktemp64という名前のバリアントを持っています。ポインタ・サイズ固有の関数の使用方法については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.10 節を参照してください。char *mktemp (char *template);
template
ユーザ定義のテンプレートを含んでいるバッファへのポインタ。テンプレートは namXXXXXX の形式で指定します。末尾の 6 つの X は,一意の文字の並びに置き換えられます。ユーザは最初の 3 つの文字を指定することができます。 template 引数は上書きされるので,文字列リテラル ( constオブジェクト) は指定しないようにしてください。
新規のアプリケーションでは, mktempを使用することは勧められません。推奨される方法については, tmpnamおよび mkstemp関数を参照してください。
x テンプレートへのポインタ。このテンプレートの内容は,作成されたファイル名に変更されます。この値が null 文字列へのポインタだった場合には,一意のファイル名が作成できなかったことを示します。
ローカル時刻構造体を,Epoch 後の経過時間に変換します。
#include <time.h>関数バリアント _DECC_V4_SOURCE および _VMS_V6_SOURCE 機能テスト・マクロを定義してコンパイルすると,OpenVMS バージョン 7.0 より前の動作と等価な,ローカル時刻ベースの mktime関数へのエントリ・ポイントが使用可能になります。time_t mktime (struct tm *timeptr);
timeptr
ローカル時刻構造体へのポインタ。
mktime関数は, timeptr がポイントするローカル時刻構造体を, time関数が返す値と同じように,Epoch 後の経過秒数に変換します。ローカル時刻をエンコードできない場合, mktimeは値 ( time_t) ( - 1) を返します。time_t型は <time.h>ヘッダ・ファイルに次のように定義されています。
typedef unsigned long int time_t;
ローカル・タイム・ゾーン情報は, mktimeが tzsetを呼び出したかのように設定されます。
timeptr がポイントするローカル時刻構造体の中の tm_isdstフィールドが正の値の場合, mktimeは,初期状態では指定された時刻でサマータイム (DST) が有効になっていると仮定します。
tm_isdstが 0 ならば, mktimeは初期状態では DST が有効でないと仮定します。
tm_isdstが負の値ならば, mktimeは指定された時刻で DST が有効になっているかどうかを判定しようと試みます。
x 指定されたカレンダ時刻を, time_t 型の値としてエンコードしたもの。 ( time_t )( - 1) ローカル時刻をエンコードできませんでした。 戻り値 ( time_t )( - 1) は, Sun Feb 7 06:28:15 2106 という有効な日付も表現できることに注意してください。
ファイル・システム・オブジェクトを仮想メモリにマップします。
#include <types.h>関数バリアント mmap関数は,それぞれ 32 ビットと 64 ビットのポインタ・サイズで使用するための _mmap32と _mmap64という名前のバリアントを持っています。ポインタ・サイズ固有の関数の使用方法については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.10 節を参照してください。#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 バージョン 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 引数が - 1 でなければ, mmap関数は実行に失敗する。
要求されたアドレスが 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 バージョン 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 引数は無効なアドレスである。
前へ | 次へ | 目次 | 索引 |