FLOCK(2)

名称
flock - 開いたファイル上の問合せ型ロックを適用または除去する

ライブラリ
libc

書式
<sys/file.h> #define LOCK_SH 0x01 /* 共有ファイルロック */ #define LOCK_EX 0x02 /* 排他的ファイルロック */ #define LOCK_NB 0x04 /* ロックするときにブロックしない */ #define LOCK_UN 0x08 /* ファイルをアンロックする */ int flock(int fd, int operation)

解説
flock() システムコールは、ファイル記述子 fd に対応するファイル上の 問合せ型 ロックを適用または除去します。 ロックを適用するには、 operation 引数に LOCK_SH または LOCK_EX のいずれかと、必要であれば LOCK_NB を加えて指定します。 既存のロックをアンロックする場合は operation を LOCK_UN にしてください。

問合せ型ロックは、協同するプロセス間での一貫したファイル操作を 可能にしますが、ファイルの一貫性を保証する ものではありません (すなわち、プロセスは問合せ型ロックを使用せずに ファイルにアクセスできるので、その結果一貫性がなくなる可能性があります)。

ロックメカニズムは 共有 ロックと 排他的 ロックという 2 つのタイプのロックを提供します。 いつでも複数の共有ロックを 1 つのファイルに適用できます。 しかし、同時に 1 つのファイルに複数の排他的ロック、 または共有ロックと排他的ロックの両方を適用することはできません。

適切なロックのタイプを指定するだけで、共有ロックは排他的ロックに アップグレード でき、排他的ロックを共有ロックに ダウングレード できます。 その結果として前のロックは解放されて 新しいロックが適用されます (他のプロセスがロックを取得し 解放した後かもしれません)。

既にロックされているオブジェクトについてロックを要求すると、 ロックが獲得できるまで呼び出し側はブロックされます。 ただし LOCK_NB が operation に含まれる場合はブロックされません。 代わりに呼び出しが失敗し、エラー EWOULDBLOCK が返されます。

注
ロックはファイルにかけられるものであって、 ファイル記述子にかけられるものではありません。 すなわち、 dup(2) または fork(2) によって複製されたファイル記述子は、 ロックの複数のインスタンスとはならずに、1 つのロックへの複数の 参照になります。 あるファイルについてのロックを保持しているプロセスがフォークし、 子プロセスが明示的にそのファイルをアンロックする場合、 親プロセスはそのロックを失います。

flock(), fcntl(2) および lockf(3) のロックは互換性があります。 異なったロックのインタフェースを使用するプロセスは、 同じファイルを安全に使用することができます。 しかしながら、同じプロセスの内部では これらのインタフェースのうちの 1 つのみが使用されるべきです。 flock() を介してあるプロセスによってあるファイルがロックされている場合、 fcntl(2) または lockf(3) を使用している他のプロセスの視点からは、 そのファイルの中のあらゆるレコードはロックされているかのように見えます。 また、その逆も同様です。

ロックを待ってブロックしているプロセスはシグナルで起こされるかもしれません。

戻り値

エラー
flock() システムコールは次の場合に失敗します:

[EWOULDBLOCK]
    ファイルはすでに LOCK_NB オプションが指定された状態でロックされています。

[EBADF]
    引数 fd が無効な記述子を指しています。

[EINVAL]
    引数 fd がファイル以外のオブジェクトを参照しています。

[EOPNOTSUPP]
    引数 fd がファイルのロックをサポートしないオブジェクトを参照しています。

関連項目
close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), flock(3)

歴史
flock() システムコールは 4.2BSD で登場しました。