EN JA
LOCKF(3)
LOCKF(3) FreeBSD Library Functions Manual LOCKF(3)

名称

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

ライブラリ

Standard C Library (libc, -lc)

書式

#include < unistd.h>

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

解説

関数 lockf() は、ファイルのセクションをアドバイザリモードロックでロックを可能にします。ロックされているファイルのセクションをロックしようと試みる他のプロセスから lockf() が呼び出されると、エラー値を返すか、セクションのロックが解除されるまでブロックされます。プロセスが終了するとプロセスのためのロックは、すべて削除されます。

引数 fd は、オープンしたファイルの記述子です。ファイル記述子は、書き込みのみ ( 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 要求は、プロセスで制御される1つ以上のロックされたセクション (全体または一部) を解放します。ロックされたセクションは、現在のファイルオフセットから size バイト、またはサイズが 0 の場合ファイルの終りまで、ロックが解除されます。ロックされたセクションのすべてが解放されないとき (すなわち、ロック解除される区域の最初か終りがロックされたセクション内にあるとき)、セッションの残りの部分は、プロセスによって引き続きロックされます。ロックされたセクションの中心部分を解放すると、残されたロックされた部分は、先頭部分と終りの部分の 2 つのセクションに分離されます。要求が、システムでのロックの数に、システムで課せられた制限値を越える場合、要求は、失敗するでしょう。

プロセスがサイズ 0 の既存のロックがあり、要求されたセクションの最終バイトを含んでいる場合、0 に等しいサイズの要求されたセクションの開始からロック解除する要求として扱われる場合、サイズが 0 でない F_ULOCK 要求は、および要求されたセクションの最終バイトのオフセットは、型 off_t のオブジェクトの最大値です。そうでなければ、 F_ULOCK 要求は、要求されたセクションのみをロック解除しようと試みるでしょう。

ロックされている領域を制御しているプロセスが、他プロセスでロックされている領域をロックしようとしてスリープ状態になると、デッドロックが生じる可能性があります。この実装は、ロックされた領域がロック解除されるまでスリープがデッドロックを起こし、 EDEADLK エラーで失敗することを検出できます。

lockf(), fcntl(2)flock(2) ロックは、互換性があります。別のロックインタフェースを使用するプロセスは、同じファイルを安全に連携できます。しかしながら、そのようなインタフェースのうちの 1 つだけが同じプロセス内で使用されるべきです。ファイルが flock(2) を介するプロセスによってロックされる場合、ファイル内のどんなレコードも fcntl(2) または lockf() を使用する別のプロセスの観点からロックされるように思われます。そしてその逆もそうです。

セクションのブロックは、任意のシグナルで割り込まれます。

戻り値

The lockf() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error. 失敗時には、既存のロックは、変更されません。

エラー

lockf() 関数は、次の場合に失敗します:
[ EAGAIN]
引数 function は、 F_TLOCK または F_TEST であり、セクションは、すでに他のプロセスによりロックされています。
[ EBADF]
引数 fd は、有効なオープンされたファイル記述子ではありません。

引数 function は、 F_LOCK または F_TLOCK であり、 fd は、書き込みのためにオープンされた有効なファイル記述子ではありません。

[ EDEADLK]
引数 function は、 F_LOCK であり、デッドロックが検出されました。
[ EINTR]
引数 function は、 F_LOCK であり、 lockf() がシグナルの送出により割り込まれました。
[ EINVAL]
引数 functionF_ULOCK, F_LOCK, F_TLOCK または F_TEST のどれにも該当しません。

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

[ ENOLCK]
引数 function は、 F_ULOCK, F_LOCK または F_TLOCK であり、安全なロックまたはロック解除の要求は、システムでのロックされた領域の数がシステムに課された制限を越え結果となります。

関連項目

fcntl(2), flock(2)

規格

lockf() 関数は、 X/Open Portability Guide Issue 4, Version 2 (“XPG4.2”) に適合しています。
September 11, 2013 FreeBSD