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