FLOCK(2) | FreeBSD System Calls Manual | FLOCK(2) |
名称
flock — オープンしたファイルのアドバイザリ (advisory) ロックを適用または削除するライブラリ
Standard C Library (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) を使用している他のプロセスの視点からは、そのファイルの中のあらゆるレコードは、ロックされているかのように見えます。また、その逆も同様です。
ロックを待ってブロックしているプロセスは、シグナルで起こされるかもしれません。
戻り値
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 がファイルのロックをサポートしないオブジェクトを参照しています。
- [ ENOLCK]
- ロックが要求されましたが、ロックが、利用可能ではありません。
歴史
flock() システムコールは、 4.2BSD で登場しました。November 9, 2011 | FreeBSD |