スポンサーリンク

FLOCK(2) FreeBSD システムコールマニュアル FLOCK(2)

名称

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

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <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() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。

エラー

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

       [EWOULDBLOCK]

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

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

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

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

関連項目

close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), lockf(3)

歴史

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

FreeBSD 10.0 December 11, 1993 FreeBSD 10.0

スポンサーリンク