LOCKF
Section: Linux Programmer's Manual (3)
Updated: 2009-07-25
Index
JM Home Page
roff page
名前
lockf - オープンされたファイルに対する POSIX ロックの適用・テスト・解除を行う
書式
#include <unistd.h>
int lockf(int fd, int cmd, off_t len);
glibc 向けの機能検査マクロの要件
(feature_test_macros(7)
参照):
lockf():
_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500
説明
オープンされたファイルのセクションに対して、
POSIX ロックの適用・テスト・解除をする。
ファイルは
fd
で指定される。
fd
は書き込みのためにオープンしたファイルディスクリプタである。
アクションは
cmd
で指定される。
pos
を現在のファイル位置とすると、
len
が正の場合、セクションはバイト位置
pos..pos+len-1
となり、
len
が負の場合、セクションはバイト位置
pos-len..pos-1
となる。
len
が 0 の場合、セクションは現在のファイル位置から無限大までとなる
(つまり現在の、あるいは変更された場合は将来の、ファイル終端位置まで)。
どの場合においても、セクションは以前のファイル終端よりも拡大されうる。
Linux では、
lockf()
は単に
fcntl(2)
のロックへのインターフェースである。
多くの他のシステムで
lockf()
はこのように実装されているが、
POSIX.1-2001 では
lockf()
と
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)
カーネルソースの
Documentation/filesystems
ディレクトリにある
locks.txt
と
mandatory-locking.txt
(以前のカーネルでは、これらのファイルは
Documentation
ディレクトリ直下にあり、
mandatory-locking.txt
は
mandatory.txt
という名前であった。)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 03:26:47 GMT, April 25, 2010