スポンサーリンク

LOCKF(3) FreeBSD ライブラリ関数マニュアル LOCKF(3)

名称

lockf − ファイル上のレコードのロック

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <unistd.h>

int

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

解説

関数 lockf() は、ファイルのセクションを助言モードロックでロックできます。 ロックされているファイルのセクションを他のプロセスからロックしようとし て、 lockf() 呼び出しを実行すると、当該セクションのロックが解除されるまで エラー表示値かまたはブロックが返ってきます。ロックはプロセスが終了すると すべて除去されます。

引数 filedes は、対象ファイルの記述子です。ファイル記述子は、書き込みのみ (O_WRONLY)、または読み込み / 書き込み両方 (O_RDWR) のどちらかで操作できる 必要があります。引数 function は所要動作を定義する制御値です。 Function で指定できる値は次のとおりです。

             Function

解説
F_ULOCK
ロックされているセクションのロック解除
F_LOCK
セクションの排他的使用のロック
F_TLOCK
セクションの排他的使用のテストとロック
F_TEST
セクションの他プロセスによるロック状況をテスト

F_ULOCK は、ファイルのセクションからロックを解除します。 F_LOCK および F_TLOCK は、どちらも、セクションが使用可能状態ならばロックします。 F_TEST は、他プロセスが指定のセクション上にあるかどうかを検査します。

引数 size は、ロックまたはロック解除対象のバイト数を示しています。ロック またはロック解除対象のセクションは、ファイル上の現在のオフセットを開始地 点とし、前方向であれば正符号の長さで、後ろ方向であれば負の長さで表しま す。(現在のオフセット値を除く後続する範囲のバイト数) しかし、ファイルの先 頭より前を開始点または対象範囲とすることはできません。 size が 0 の場合、 セクションは現在の地点からファイル上で取りうる最大範囲の地点までロックさ れます (すなわち、現在の地点から現時点のまたは今後拡張するファイルの終了 部分までです)。

F_LOCK または F_TLOCK でロックされたセクションは、同一プロセスで先行して ロックされたセクションの全体または一部を含むかあるいは含まれることがあり ます。この場合、またはロックされたセクションが隣接するとき、これらのセク ションは一つのロックされたセクションに統合されます。要求によりロックの数 がシステムで定めた限界を超えた場合、要求はエラーになります。

F_LOCK および F_TLOCK による要求は、セクションが利用不可の場合それぞれの 取る動作について差異があります。 F_LOCK は、セクションが利用可能になるま で呼び出しプロセスを抑制します。 F_TLOCK では、他プロセスが既にロックして いる場合、関数はエラーになります。

ファイルのロックは、ファイルの記述子のロックプロセスが終了して初めて解除 されます。

F_ULOCK 要求は、プロセスで制御される複数のロックされたセクション (全体ま たは一部) を解放します。ロックされたセクションは、現在のファイル上の地点 から size で示す長さのバイト数分、またはサイズ指定が 0 の場合ファイルの終 了位置まで、ロックが解除されます。ロックされたセクションがすべて解放され ないとき (すなわち、ロック解除される区域の最初の部分または終りの部分が ロックされたセクションにあるとき)、セクションの残りの部分はプロセスにより 引き続きロックされます。ロックされたセクションの中心部分を解放することに より、ロックされた残りの部分は、先頭区域と終りの区域の 2 つのセクションに 分離されます。要求により、システム内のロックの数が、システムで定めた制限 値を越える場合、その要求の処理は不成功になります。

F_ULOCK 要求は、サイズ指定が 0 でなく、要求されたセクションの最終バイトの 位置が、off_t 型のオブジェクトに対する最大値を越えない場合、またはプロセ ス内にサイズ 0 のロックがあり、要求対象セクションの最終バイトを含んでいる 場合、サイズ 0 の要求対象セクションの開始位置からロック解除する要求として 扱われます。そうでない場合、 F_ULOCK 要求は、要求対象のセクションだけを ロック解除しようとします。

ロックされている区域を制御しているプロセスが、他プロセスでロックされてい る区域をロックしようとしてスリープ状態になると、デッドロックが起こる可能 性があります。この仕組みにより、ロックされた区域がロック解除されるまでの スリープがデッドロックを起こし、 EDEADLK エラーで異常終了することを検出で きます。

lockf(), fcntl(2) および flock(2) によるロックは同時併行で問題なく使用で きます。セクションでの防護処理は適当なシグナルで解釈されます。

戻り値

関数 lockf() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。失敗時には、 既存のロックは変更されません。

エラー

lockf() は、次の状態のとき不成功となります。

       [EAGAIN]

引数 function は、 F_TLOCK または F_TEST であり、セク ションはすでに他のプロセスによりロックされています。

[EBADF]
引数 filedes は妥当でない対象ファイル記述子です。引数 function F_TLOCK または F_TEST であり、引数 filedes は 書き込み可能ファイルとして妥当なファイル記述子ではあり ません。

[EDEADLK]
引数 function は F_LOCK であり、デッドロックが検出され ました。

[EINTR]
引数 function は F_LOCK であり、 lockf() がシグナル発 生により中断されました。

[EINVAL]
引数 function が F_ULOCK, F_LOCK, F_TLOCK, or F_TEST のどれにも該当しません。

引数 filedes がロックをサポートしないファイルを示して います。

[ENOLCK]
引数 function は F_ULOCK, F_LOCK, または F_TLOCK であ り、ロックまたはロック解除の要求により、ロック区域の数 がシステムで定めた制限値を越えます。

関連項目

fcntl(2), flock(2)

規格

lockf() 関数は X/Open Portability Guide Issue 4.2 (‘‘XPG4.2’’) に適合して います。

FreeBSD 10.0 December 19, 1997 FreeBSD 10.0

スポンサーリンク