tail head cat sleep
QR code linking to this page

manページ  — FLOCK

名称

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

内容

ライブラリ

Standard C Library (libc, -lc)

書式

#include <sys/file.h>

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

解説

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

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

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

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

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

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

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

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

戻り値

The flock function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

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() システムコールは BSD 4.2 で登場しました。

FLOCK (2) December 11, 1993

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

… one of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs.
— Robert Firth