LOCKF(3)

名称
lockf - ファイル上のレコードのロック

LIBRARY
libc

書式
#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() 関数は xpg4.2 に準拠しています。