日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
fcntl |
オープンされているファイルに対して制御操作を実行します。
#include <sys/types.h>#include <unistd.h>
#include <fcntl.h>
int fcntl (int file_desc, int request [, int arg]);
int fcntl (int file_desc, int request [, struct flock *arg]);
file_desc
正常終了した open, fcntl, pipe関数から返されたオープン・ファイル記述子。request
実行する操作。arg
request 引数の値に応じて異なる変数。request が F_DUPFD,F_SETFD,または F_SETFL の場合は, arg として intを指定します。
request が F_GETFD と F_GETFL の場合は, arg を指定しません。
request が F_GETLK,F_SETLK,または F_SETLKW の場合は, arg として flock構造体へのポインタを指定します。
fcntl関数は,file_desc 引数によって指定される,オープンされているファイルに対して制御操作を実行します。request 引数の値は,ヘッダ・ファイル <fcntl.h>に定義されています。次の値が定義されています。
F_DUPFD int 型の整数として受け付けられる 3 番目の引数 ( arg) に等しいか,またはそれ以上で,使用可能な ( つまりまだオープンされていない ) ファイル記述子のうち,最小の新しいファイル記述子を返します。 新しいファイル記述子は元のファイル記述子 ( file_desc) と同じファイルを参照します。新しいファイル記述子に関連付けられる FD_CLOEXEC フラグは, exec 関数のいずれかの呼び出しでファイルをオープンしたままにしておくためにクリアされます。
次の 2 つの呼び出しは同じです。
fid = dup(file_desc);
fid = fcntl(file_desc, F_DUPFD, 0);
次の呼び出しがあるとします。
fid = dup2(file_desc, arg);
これは,次の呼び出しに類似しています ( ただし,同じではありません )。
close(arg);
fid = fcntl(file_desc, F_DUPFD, arg);
F_GETFD ファイル記述子 file_desc に関連付けられている close-on-exec フラグの値を取得します。ファイル記述子フラグは,1 つのファイル記述子に関連付けられ,同じファイルを参照する他のファイル記述子には影響を与えません。 arg 引数は指定しないでください。 F_SETFD file_desc に関連付けられている close-on-exec フラグを 3 番目の引数の値に設定します。この引数は int 型です。 3 番目の引数が 0 の場合は,ファイルは exec 関数の呼び出しでオープンされたままになります。つまり, exec 関数から生成された子プロセスは,親からこのファイル記述子を継承します。
3 番目の引数が FD_CLOEXEC の場合は,次の exec 関数の実行が正常終了したときに,ファイルはクローズされます。つまり, exec 関数で生成された子プロセスは,親からこのファイル記述子を継承しません。
F_GETFL file_desc に関連付けられたファイル記述に対し, <fcntl.h> で定義されているファイル状態フラグとファイル・アクセス・モードを取得します。ファイル・アクセス・モードは, <fcntl.h> で定義されているマスク O_ACCMODE を使用して,戻り値から取り出すことができます。ファイル状態フラグおよびファイル・アクセス・モードは,ファイル記述に関連付けられており,異なるオープン・ファイル記述で同じファイルを指す,ほかのファイル記述子には影響しません。 F_SETFL file_desc に関連付けられたファイル記述に対し, int 型の第 3 引数 arg の対応するビットから, <fcntl.h> で定義されているファイル状態フラグを設定します。 arg で設定されているビットのうち, <fcntl.h> で定義されているファイル・アクセス・モードやファイル作成フラグに対応するビットは,無視されます。ここで説明した以外の arg のビットをアプリケーションが変更すると,結果は不定となります。 注意: 認識される状態ビットは O_APPEND だけです。 O_APPEND のサポートは標準に準拠していません。 X/Open 標準では,「ファイル状態フラグとファイル・アクセス・モードは,ファイル記述に関連付けられており,異なるオープン・ファイル記述で同じファイルを指す,ほかのファイル記述子には影響しない」となっています。しかし,追加ビットは FCB に格納されるため,同じ FCB を使用するすべてのファイル記述子は,同じ追加フラグを使用することになり, fcntl(F_SETFL) を使用してこれを設定すると,FCB を共用しているすべてのファイル,すなわち,同じファイル記述子から複製されたすべてのファイルに影響があります。
レコード・ロックの要求 F_GETLK arg パラメータ ( struct flock 型を指すポインタ) で指定したロック記述構造体に対して,それをブロックしている最初のロックを取得します。そのようなロックがあった場合は,その情報によって, fcntl 関数に渡された flock 構造体の中の情報が上書きされます。このロックの生成を妨げているロックがなかった場合は,ロック・タイプの設定が F_UNLCK に変更されることを除いて,その構造体がそのまま返されます。 F_SETLK arg パラメータ ( struct flock 型を指すポインタ) で指定したロック記述構造体の内容に従って,ファイル・セグメントのロックを設定または削除します。 F_SETLK は,共用ロックを設定する場合 (F_RDLCK),排他ロックを設定する場合 (F_WRLCK),または,それらのいずれかを削除する場合 (F_UNLCK)に使用します。共用 (読み取り) ロックまたは排他 (書き込み) ロックが設定できないと, fcntl 関数はすぐに終了して,値 - 1 を返します。 flock 構造体の l_len がゼロになっていなくて,しかも要求セグメントの最後のバイトのオフセットが off_t 型オブジェクトの最大値になっているようなアンロック要求 (F_UNLCK) は,プロセスが, l_len = 0 でしかも要求セグメントの最後のバイトを含むようなロックをすでに行っていると,その要求セグメントを先頭からアンロックする要求として扱われます。また,これ以外の条件でアンロックを要求すると (F_UNLCK),要求したファイル全体を対象にして,アンロックが試みられます。
F_SETLKW 共用ロックまたは排他ロックが他のロックによってブロックされていればそのロックがアンブロックされるまで待つということ以外は, F_SETLK と同じです。 fcntl の処理で,ある領域がアンロックされるのを待っているときにシグナルを受信すると,関数が中断され, - 1 が返されるとともに, errno に EINTR が設定されます。
ファイルのロック
C RTL では, fcntl関数の F_GETLK コマンド, F_SETLK コマンド,および F_SETLKW コマンドで, X/Open で定義されている仕様と同じように,バイト単位のファイル・ロックをサポートしています。このバイト単位のファイル・ロックは, OpenVMS クラスタ間でもサポートされています。ただし,オフセットとして使用できる値は,32 ビットの符号なし整数に収まる範囲だけです。
ファイルのセグメントに設定されているロックが共用ロックである場合は,クラスタ上の他のプロセスから,そのセグメントやその一部に対して,共用ロックを設定することができます。しかし,たとえその範囲が一部であっても,共用ロックが設定されている保護領域に他のプロセスから排他ロックを設定することはいっさいできません。また,共用ロックの要求は,ファイル記述子が読み取り用にオープンされていないと失敗します。
設定されているロックのタイプが排他ロックである場合は,たとえその範囲が一部であっても,クラスタ上の他のプロセスからその保護領域に共用ロックまたは排他ロックを設定することはできません。また,排他ロックの要求は,ファイル記述子が書き込み用にオープンされていないと失敗します。
flock構造体には,対象となるファイル・セグメントの,型 (l_type),開始オフセット (l_whence),相対オフセット (l_start),サイズ (l_len),およびプロセス ID (l_pid) を設定します。
l_whence の値として設定できる値は,SEEK_SET (相対オフセット l_start のバイトをファイルの先頭から計算する), SEEK_CUR (現在の位置から計算する),および SEEK_END (ファイルの末尾から計算する) です。 l_len の値は,ロック対象領域のバイト数です (このロック対象領域は連続している必要があります)。 l_len の値には,負の値を設定することもできます (ただし, off_tの定義でそれが許されている場合だけ)。 l_pid フィールドは,そのロックをブロックしているプロセスの ID を返してもらうために, F_GETLK でだけ使用されます。要求が F_GETLK の場合は,その処理に成功すると, l_whence に SEEK_SET が設定されます。
l_len に正の値を設定すると, l_start から始まって l_start + l_len - 1 で終わる領域が対象になります。 l_len に負の値を設定すると, l_start + l_len から始まって l_start - 1 で終わる領域が対象になります。ロックの対象となる領域の開始位置と終了位置は,現在のファイルの末尾より後ろにあってもかまいません。つまり,現在のファイルの末尾より後ろにある領域もロックできます。しかし,対象領域の開始位置または終了位置をファイルの先頭に対して負の方向に設定することはできません。 l_len に 0 を設定すると,ロックの対象領域つまり終了位置は,そのファイルのオフセットして可能な最大値まで常に拡張されます。またこれに加えて,l_start にも 0 を設定して,さらに l_whence に SEEK_SET を設定すると,ファイル全体がロックの対象になります。
ロックされているセグメントの中間部分をアンロックしたり,そのロック・タイプを変更したりすると,両端にそれより小さいセグメントが残ってしまいます。また呼び出しプロセスがすでにロックしているセグメントを再度ロックすると,設定されていたロックのタイプが削除されて,新しいロックのタイプが有効になります。
あるファイルを特定のプロセスがロックしていたときに,そのプロセスがそのファイルのファイル記述子をクローズしたり,そのファイル記述子を保持しているプロセスが終了したりすると,それらのプロセスに関連したそのファイルのロックがすべて削除されます。ロックが,子プロセスに継承されることはありません。
request 引数に F_SETLKW を設定した場合は,そのロック要求が他のプロセスの掛けたロックでブロックされると,そのロックの解除を待ってスリープすることになり,デッドロックが発生して,アプリケーションがハングすることがあります。
n 正常終了時に返される値は,次に示すように, request 引数の値に応じて異なります。
- F_DUPFD ---新しいファイル記述子を返します。
- F_GETFD ---FD_CLOEXEC または 0 を返します。
- F_SETFD , F_GETLK , F_SETLK , F_UNLCK --- - 1 以外の値を返します。
-1 エラーが発生したことを示します。 errno は以下のいずれかの値に設定されます。
- EACCES -- (1) request 引数が F_SETLK であったか, (2) ロックのタイプ ( l_type) が共用 (F_RDLCK) または排他 (F_WRLCK) で,対象となるファイルのセグメントが他のプロセスからの排他ロックですでにロックされているか, (3) ロックのタイプが排他 (F_WRLCK) で,対象となるファイルのセグメントが他のプロセスからの共用ロックまたは排他ロックですでにロックされています。
- EBADF--- file_desc 引数が有効なオープンされているファイル記述子ではなく, arg 引数が負の値であるか,またはプロセス単位のリミットに等しいか,それ以上の値です。
request パラメータの値が F_SETLK または F_SETLKW で,しかもロックのタイプ ( l_type) が共用ロック (F_RDLCK) であったのにもかかわらず, file_desc で指定されたファイル記述子が読み取り用にオープンされていないか,有効ではありませんでした。
ロックのタイプ ( l_type) が排他ロック (F_WRLCK) であったのにもかかわらず, file_desc で指定されたファイル記述子が書き込み用にオープンされていないか,有効ではありませんでした。
- EFAULT--- arg 引数が不正なアドレスです。
- EINVAL--- request 引数が F_DUPFD であり, arg 引数が負の値であるか,または OPEN_MAX に等しいか,それより大きな値です。
OPEN_MAX の値またはプロセス単位のソフト記述子リミットが確認されます。
不正な値が request 引数に対して指定されました。
引数 request の値が F_GETLK,F_SETLK,または F_SETLKW であるにもかかわらず, arg の指しているデータが無効か, file_desc が,ロックをサポートしていないファイルを参照していました。
- EMFILE--- request 引数が F_DUPFD であり,呼び出しプロセスで現在多すぎる個数または OPEN_MAX 個のファイル記述子がオープンされています。または, arg 引数以上のファイル記述子を使用することはできません。
OPEN_MAX の値またはプロセス単位のソフト記述子リミットが確認されます。
- EOVERFLOW ---返すべき値の中に,正しく表現できないものがありました。
引数 request の値は F_GETLK,F_SETLK,または F_SETLKW ですが,対象となるセグメントにあるバイトの最小オフセットまたは最大オフセット ( l_len がゼロでない場合) が, off_t 型のオブジェクトで正しく表現できませんでした。
- EINTR ---引数 request の値は F_SETLKW ですが,シグナルによって関数が中断されました。
- ENOLCK ---引数 request の値は F_SETLK または F_SETLKW ですが,ロックのまたはアンロックの要求を満たそうとすると,構成可能なシステム・リミットの値 NLOCK_RECORD を超えてしまいます。
- ENOMEM---システムは要求されたファイル記述子に対してメモリを割り当てることができませんでした。
目次 | 索引 |
|