名前
flock - オープンされたファイルに対するアドバイザリロックの適用、解除を行う書式
#include <sys/file.h> int flock(int fd, int operation);説明
オープンされたファイルにアドバイザリロック (advisory lock) の適用 や解除を行う。 ファイルは fd で指定する。引数 operation には以下のいずれか一つを指定する:- LOCK_SH
- 共有ロックを適用する。 指定したファイルに対して、 一つ以上のプロセスが同時に共有ロックを保持することができる。
- LOCK_EX
- 排他ロックを適用する。 指定したファイルに対して、 ただ一つのプロセスだけが同時に排他ロックを保持することができる。
- LOCK_UN
- このプロセスが保持している既存のロックを解除する。
返り値
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。エラー
- EBADF
- fd がオープンされたファイルディスクリプターではない。
- EINTR
- ロックの獲得を待っている間に、ハンドラーにより捕捉されたシグナルを 受信し、 flock() が中断された。 signal(7) 参照。
- EINVAL
- oepration が無効である。
- ENOLCK
- ロックレコードを割り当てるためのメモリーが不足している。
- EWOULDBLOCK
- 指定したファイルがロックされており、 LOCK_NB フラグが指定されている。
準拠
4.4BSD ( flock() コールは 4.2BSD で最初に登場した)。 fcntl(2) で実装されているものなどを含めると、 flock() の機能はほとんどの UNIX システムで実装されている。注意
kernel 2.0 以降では、 flock() は、GNU C ライブラリでの fcntl(2) を呼び出してのエミュレーションではなく、 それ自体がシステムコールとして実装されている。 この実装では、 flock() と fcntl(2) で適用されるロックの種別には相互作用がなくなり、 flock() がデッドロックを検出しなくなる。 (ただし、最近の BSD などいくつかのシステムでは、 flock() と fcntl(2) ロックが互いに影響することが「ある」という点に注意すること。) flock() アドバイザリロックだけを適用する。したがって、ファイルに適切なアクセス権を 付与していれば、プロセスは flock() の使用に無視して、ファイルへの入出力を行うことができる。 flock() と fcntl(2) は fork されたプロセスと dup(2) で違った動作をする。 flock() を fcntl(2) を使って実装しているシステムでは、 flock() の動作はこのマニュアルページに記載されているものとは違うだろう。 ロックの変換 (共有ロックから排他ロックへ、もしくはその反対) がアトミックに 行われることは保証されていない: 既存のロックがまず削除され、それから新しい ロックが設定される。この 2つのステップの間に、他のプロセスからの処理待ちの ロック要求が認められるかもしれず、結果として変換は停止 (block) したり、 ( LOCK_NB が指定された場合には) 失敗したりする。 (これは元々の BSD の動作であり、多くの他の実装でも起こる。)NFS での詳細
In Linux kernels up to 2.6.11, flock() does not lock files over NFS (i.e., the scope of locks was limited to the local system). Instead, one could use fcntl(2) byte-range locking, which does work over NFS, given a sufficiently recent version of Linux and a server which supports locking. Since Linux 2.6.12, NFS clients support flock() locks by emulating them as fcntl(2) byte-range locks on the entire file. This means that fcntl(2) and flock() locks do interact with one another over NFS. It also means that in order to place an exclusive lock, the file must be opened for writing. Since Linux 2.6.37, the kernel supports a compatibility mode that allows flock() locks (and also fcntl(2) byte region locks) to be treated as local; see the discussion of the local_lock option in nfs(5).関連項目
flock(1), close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), lockf(3), lslocks(8) Linux カーネルソース内の Documentation/filesystems/locks.txt (以前のカーネルでは Documentation/locks.txt)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。2017-09-15 | Linux |