LOCKF(3) — UNIX Programmer’s Manual
名称
lockf − ファイル上でのレコードのロック
形式
#include <fcntl.h>
#define F_ULOCK 0 /∗直前にロックしたセクションを解除する ∗/
#define F_LOCK 1 /∗セクションをロックして、独占する ∗/
#define F_TLOCK 2 /∗セクション(非ブロッキング)を検査、ロックする∗/
#define F_TEST 3 /∗他プロセスによるロックがあるかどうか、セクションを検査する ∗/
lockf(fd, cmd, size)
int fd, cmd;
long size;
解説
lockf は、 ファイルオープン記述子 fd で指定される ファイル上のレコードのロックを、 検査または、 追加、 解除することができます(レコードのロックに関するより詳しい情報は、 fcntl(2) を 参照してください)。
引数 cmd の値が、 F_LOCK または F_TLOCK のときにロックします。 ロックを 解除するには、 F_ULOCK を cmd に使用します。 また、 指定されたセグメントが他プロセスからロックされているかどうかを 調べる場合には、 F_TEST" を 使用します。
F_LOCK" と" F_TLOCK" の要求の違いは、 すぐにロックできない場合に行われる動作だけです。 F_TLOCK" の場合、 セクションが既に他プロセスによってロックされているならば、 −1 を返し、 errno に EAGAIN を セットします。 F_LOCK の場合、 ロックできるようになるか、 シグナルが受信されるまで、 プロセスを スリープ状態にします。
size は、 ロックしたり、 ロックを 解除したりする範囲のバイト数です。 ロックは、 ファイルの中のカレントオフセットから始まり、 size の値が正ならば順方向へ、 負の場合ならば逆方向へ進みます(カレントオフセットまでの動きは、 範囲には含まれません)。 ロックを するために、 ファイルにセグメントを 割り当てる必要はありません。 しかし、 セグメントに負の値を与えることにより ファイルの先頭より前にまで広げることは、できません。 size が 0 の場合、 カレントオフセットからエンドオブファイルまでの範囲を ロックします。 このとき、 オフセット値 0 でロックを 始めると、 (将来のファイルの拡張を 無視して)ファイル全体がロックされます。
注記
この関数を 呼び出してロックする場合、 ファイル記述子 fd は、 O_WRONLY または O_RDWR 許可で、 オープンされていなければなりません。
ファイルがクローズされるか、 または、 プロセスが終了するとき、 そのプロセスに関連するファイルのロックはすべて解除されます。 ロックは、 システムコール fork(2) で生成する子プロセスには引き継がれません。
リターン値
正常終了すると、 値 0 が返され、 エラーが発生した場合は、 値 −1 が返されます。 エラーコードは、 errno にセットされます。
エラー
次に述べる項目のうち、 1つ以上が真のとき、 lockf は異常終了します。
EBADF fd が有効なオープンファイル記述子ではない。
EBADF cmd が F_LOCK または F_TLOCK で、 プロセスがファイルへの書き込み許可を 持っていない。
EAGAIN cmd が F_TLOCK または F_TEST で、 セクションがすでに他プロセスによってロックされている。
EINTR cmd が F_LOCK で、 ロックするのを 待っている間に、 シグナルがプロセスに割り込んだ。
ENOLCK cmd が F_LOCK、 F_TLOCK または F_ULOCK で、 ファイルのロックのエントリがすでにいっぱいで利用できない。
関連事項
バグ
lockf 機構によって実現したファイルロックと、 flock(2) によって実現したロックは、 相互間での作用はしません。 しかし、 fcntl(2) によって要求されたロックとは正しく動作します。
NEWS-OSRelease 3.3