lockf() - ファイルでのレコード・ロック

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _XOPEN_SOURCE_EXTENDED 1
#include <unistd.h>

int lockf(int filedes, int function, off_t size);

機能説明

lockf() 関数では、ファイルのセクションを通知モード・ロックでロックすることができます。ロックされたファイル・セクションを、ロックしようとしている別のプロセスから lockf() を呼び出すと、エラー値を戻されるか、またはセクションがアンロックされるまでブロックされます。プロセスが終了すると、プロセスのすべてのロックが解除されます。lockf() でのレコードのロックは、通常のファイルにサポートされています。

filedes 引数は、オープン・ファイル記述子です。ファイル記述 子は、この関数でロックを確立するために、書き込み専用許可 (O_WRONLY) か、または 読み取り/書き込み許可 (O_RDWR) でオープンされなければなりません。

function 引数は、取られるアクションを指定する制御値です。function に許可される値は、<unistd.h> で次のように定義されています。
Function   Description
------------------------------------------------------
F_ULOCK    unlock locked sections
F_LOCK     lock a section for exclusive use
F_TLOCK    test and lock a section for exclusive use
F_TEST     test a section for locks by other processes

F_TEST は、別のプロセスによるロックが特定のセクションに存在するのを検出 します。F_LOCK および F_TLOCK は両方とも、セクションが使用可能な場合、ファイル のセクションをロックします。F_ULOCK は、ファイルのセクションからアンロックします。

size 引数は、ロックまたはアンロックされる隣接バイト数です。ロックまたはアンロックされるセクションは、ファイル内の現行オフセ ットから始まり、正数サイズだけ前に、負数サイズだけ後ろに (現行オフ セットを含まないが、現行オフセットまでの先行バイト) 拡張した部分 です。size が 0 の場合は、現行オフセットから可能な 最大ファイル・オフセットまで (つまり、現行オフセットから現在または 未来のファイル終わり (EOF) まで) がロックされます。ロックはファイル終わりを超えてもかまわないので、ロックするファイルに 領域を割り振る必要はありません。

F_LOCK または F_TLOCK でロックされたセクションは、全体または一部 が、同じプロセスの以前にロックされたセクションを含んだり、含まれることがあります。これが起きると、または隣接のセクションがロックされた場合、セクションは単一のロック・セクションに結合されます。 要求によってロック数がシステムの制限を超える場合、その要求は失敗します。

F_LOCK および F_TLOCK 要求は、セクションが使用可能でない場合に取られ るアクションが異なるだけです。F_LOCK は、セクションが使用可能になるまで、プロセスの呼び出しをブロックし ます。F_TLOCK は、セクションが既に別のプロセスによってロックされている場合 は、関数を失敗させます。

ファイルのロックは、ファイルのいずれかのファイル記述子のロック・プロセス によって、最初のクローズで解放されます。

F_ULOCK 要求は、プロセスによって制御される 1 つ以上のロック・セクショ ン (全体または一部) を解放します。ロックされたセクションは、現行の ファイル・オフセットから size バイトまで、または size が (off_t)0 の場合はファイル終わり (EOF) まで、アンロックされます。すべてのロック・セクションが解放されない場合 (つまり、アンロックされた領域の始めまたは終わりが、ロック・セクション内に 入ってしまう場合)、そのセクションの残りの部分はまだプロセスによってロッ クされています。ロック・セクションの中央部分を解放すると、ロック・セクションが 2 つに分 かれた、始めの部分と終わりの部分はロックされたままになります。要求によって システム内のロック数がシステムの制限を超える場合、その要求は失敗します。

ロック・セクションを制御しているプロセスが、別のプロセスのロック・セクションを アクセスすることによってブロックされている場合には、デッドロックが起きる可能性が あります。システムがデッドロックの発生を 検出すると、lockf() は EDEADLK エラーで失敗します。

lockf() によって得られたロックは、fcntl() によって得られたロックを 制御する同じ機能によって制御されます。

fcntl() ロックと lockf() ロック間の対話は指定されません。

セクションのブロック化は、どんなシグナルによっても割り込みを受けます。

z/OS UNIX の大規模ファイルのサポート: AMODE 64 C/C++ アプリケーションの場合は、z/OS UNIX の大規模ファイルが自動的にサポートされます。AMODE 31 C/C++ アプリケーションは、オプション LANGLVL(LONGLONG) を指定してコンパイルされなければなりません。また、ヘッダーがインクルードされる前に _LARGE_FILES フィーチャー・テスト・マクロを定義して、2 GB のサイズより大きい z/OS UNIX ファイルをこの関数が操作できるようにしなければなりません。ファイル・サイズとオフセット・フィールドは、63 ビットの幅に拡張されます。したがって、_LARGE_FILES フィーチャー・テスト・マクロの定義も行うには、ファイルを操作する他のいずれかの関数が必要です。

戻り値

正常に実行された場合、lockf() は 0 を戻します。

正常に終了しなかった場合、現存のロックは変更されないで、lockf() は -1 を戻し、errno を以下の値のいずれかに設定します。
エラー・コード
説明
EACCES または EAGAIN
function 引数が F_TLOCK または F_TEST で、かつセクションが 既に別のプロセスによってロックされています。
EBADF
filedes 引数が有効なオープン・ファイル記述子ではありません。または、function が F_LOCK または F_TLOCK で、かつ filedes が書き込み用にオープンされる有効なファイル記述子ではありません。
EDEADLK
function 引数が F_LOCK で、デッドロックが検出されました。
EINTR
関数の実行中にシグナルをキャッチしました。
EOVERFLOW
要求されたセクションの最初のバイト (または、サイズが 0 でない場合は、最後のバイト) のオフセットは、off_t 型のオブジェクトでは正しく表すことができません。

関連情報