int flock(int fd, int operation);
flock() を呼び出したときに、指定したロック種別と異なるロックが別プロセスによって 保持されていると、 flock() は停止 (block) されることがある。 非停止 (nonblocking) タイプの要求を行うためには、 上記の操作 (operation) に LOCK_NB を論理和の形で指定する。
一つのファイルに共有ロックと排他ロックを同時に設定することはできない。
flock() によって作られるロックは、 オープンファイル記述 (open file description) (open(2) 参照) と関連付けられる。 したがって、ファイルディスクリプターの複製 (fork(2) や dup(2) などにより作成される) は同じロックを参照し、 これらのファイルディスクリプターのどれを使っても このロックを変更したり解放したりできる。 また、ロックの解放は、 上記の複数のファイルディスクリプターのいずれかに対して 明示的に LOCK_UN 操作を指示した場合か、これらのファイルディスクリプターがすべて 閉じられた場合に行われる。
あるプロセスが open(2) (もしくは同様の方法) を使って同じファイルに対して 複数のファイルディスクリプターを取得した場合、 flock() はこれら複数のファイルディスクリプターを各々独立のものとして扱う。 これらのファイルディスクリプターの一つを使ってファイルをロックしようと した際、そのロック要求は、呼び出し元のプロセスがそのファイルの別のファイルディスクリプター経由ですでに設定しているロックによって拒否される場合がある。
一つのプロセスは、一つのファイルに対して (共有ロックと排他ロックのうち) いずれか一種類のロックしか設定できない。 既にロックされたファイルに対して flock() を呼び出すと、既存のロックを新しいロックモードに変更することになる。
flock() により作成されたロックは execve(2) の前後で保存される。
共有ロックも排他ロックも、ファイルがどのモードでオープンされたかに 関係なく適用することができる。
flock() アドバイザリロックだけを適用する。したがって、ファイルに適切なアクセス権を 付与していれば、プロセスは flock() の使用に無視して、ファイルへの入出力を行うことができる。
flock() と fcntl(2) は fork されたプロセスと dup(2) で違った動作をする。 flock() を fcntl(2) を使って実装しているシステムでは、 flock() の動作はこのマニュアルページに記載されているものとは違うだろう。
ロックの変換 (共有ロックから排他ロックへ、もしくはその反対) がアトミックに 行われることは保証されていない: 既存のロックがまず削除され、それから新しい ロックが設定される。この 2つのステップの間に、他のプロセスからの処理待ちの ロック要求が認められるかもしれず、結果として変換は停止 (block) したり、 (LOCK_NB が指定された場合には) 失敗したりする。 (これは元々の BSD の動作であり、多くの他の実装でも起こる。)
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).
Linux カーネルソース内の Documentation/filesystems/locks.txt (以前のカーネルでは Documentation/locks.txt)