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