名前
lockf - 開いているファイルに対して POSIX ロックを適用・テスト・解除する。
書式
#include <unistd.h>
int lockf(int fd, int cmd, off_t len);
説明
開いているファイルのセクションに対して、 POSIX ロックの適用・テスト・解除をする。 ファイルは fd で指定される。 これは書き込みのためにオープンしたファイルディスクリプタである。 アクションは cmd で指定される。 pos を現在のファイル位置とすると、 len が正の場合、セクションはバイト位置 pos..pos+len-1 である。 len が負の場合、セクションはバイト位置 pos-len..pos-1 である。 len が 0 の場合、セクションは現在のファイル位置から無限大までとなる (つまり現在の、あるいは変更された場合は将来の、ファイル終端位置まで)。 どの場合においても、セクションは以前のファイル終端よりも拡大されうる。
Linux では、この関数は単に fcntl(2) へのインターフェースである。 (一般には、 lockf() と fcntl(2) の関係は指定されていない。)
有効なオプションを以下に挙げる。
F_LOCK | ファイルの指定されたセクションに排他ロックを設定する。 そのセクション (の一部) が既にロックされていた場合、 前のロックが解除されるまで関数の呼び出しがブロックされる。 このセクションが前にロックされているセクションと重なった場合、 2 つのセクションは結合される。 ロックを保持しているプロセスが、 そのファイルのファイルディスクリプタをクローズすると、 ファイルロックは解放される。 子プロセスはロックを継承しない。 |
F_TLOCK | |
F_LOCK と同様であるが、ファイルが既にロックされている場合、 関数の呼び出しはブロックを行わずにエラーを返す。 | |
F_ULOCK | |
ファイルの指定されたセクションのロックを解除する。 これによりロックされたセクションが 2 つに分割されるかもしれない。 | |
F_TEST | 次のようにロックのテストをする。 指定されたセクションがロックされていないか、 このプロセスによりロックされている場合、0 を返す。 他のプロセスがロックを保持している場合、-1 を返し、 errno を EAGAIN (いくつかの他のシステムでは EACCES) に設定する。 |
返り値
成功した場合、0 が返される。 エラーの場合、-1 が返され、 errno がエラーに対応した値に設定される。
エラー
EACCES もしくは EAGAIN | |
ファイルがロックされて、 F_TLOCK または F_TEST フラグが選択されている。 または、ファイルが他のプロセスによりメモリーマップされているために、 操作が禁止されている。 | |
EBADF | fd が開いているファイルのディスクリプタではない。 |
EDEADLK | |
コマンドが T_LOCK であり、このロック操作がデッドロックを引き起こしている。 | |
EINVAL | fd に無効な操作が指定された。 |
ENOLCK | 非常に多くのセグメントロックが開かれ、ロックテーブルが溢れた。 |
準拠
SVr4, POSIX.1-2001
関連項目
fcntl(2), flock(2) /usr/src/linux/Documentation にある locks.txt と mandatory.txt も参照すること。