FLOCK(2) — NEWS-OS Programmer’s Manual
名称
flock − オープンされているファイルに対してアドバイザリロックを 適用する/解除する
形式
#include <sys/file.h>
#defineLOCK_SH1/∗ shared lock ∗/
#defineLOCK_EX2/∗ exclusive lock ∗/
#defineLOCK_NB4/∗ don’t block when locking ∗/
#defineLOCK_UN8/∗ unlock ∗/
flock(fd, operation)
int fd, operation;
解説
flock は、 ディスクリプタ fd に関するファイルに対し、 アドバイザリロックの適用または解除を行います。 ロックは、LOCK_SH、LOCK_EX または LOCK_NB などの論理和より作られる operation パラメタを指定することによって適用されます。 既存のロックを解除するためには、 operation を LOCK_UN にします。
アドバイザリロックを 使用することによって、 協調して稼働する複数のプロセスは、 複数のファイルに対して矛盾のないオペレーションを 遂行することができます。 しかし、 アドバイザリロックは一貫性を 保証してはいません。 (つまり、 それらのプロセスはアドバイザリロックを 使用しないでファイルにアクセスすることができるので、 その結果矛盾が生じる可能性があるということです。)
ロックメカニズムでは 2 つのタイプのロックが可能です。 それらは、 共有 ロックと 排他的 ロックです。 いつでも複数の共有ロックを 1 個のファイルに対して適用することはできますが、 複数の排他的ロック または共有ロックと排他的ロックの両方を、 同時に 1 個のファイルに対して適用することはできません。
適切なロックタイプを 指定するだけで、 共有ロックを排他的ロックへ グレードアップ することができ、 その逆も可能です。 これを行うと、 以前のロックが解除されて新しいロックが適用されます(普通、 これは他のプロセスがあるロックを 獲得して解放したあとに行われます)。
既にロックされているファイルに対してロックを 要求すると、 通常、 その呼び出し元は、 そのロックを 獲得できるようになるまでブロックされます。 LOCK_NB が operation に含まれている場合には、 これは発生しません。 代わりにそのコールは失敗に終わり、 エラー EWOULDBLOCK が返されます。
注意事項
ロックは、 ファイルディスクリプタではなく、 ファイルに対するものです。 つまり、 dup(2) や fork(2) で二重化すると、複数のロックができるのではなく、 単一のロックに対する複数の参照を 生じさせることとなります。 あるファイルに対してロックを 保持しているプロセスが新しいプロセスを 作った場合に、 その子プロセスが明示的にそのファイルを ロック解除すると、 親プロセスは保持していたロックを失います。
ロック解除を待っているプロセスは、 シグナルによって起こされます。
リターン値
オペレーションが成功した場合には、 0 が返されます。 エラーが発生すると、 −1 が返され、 エラーコードがグローバル変数 errno に入れられます。
エラー
次の場合、 flock コールは失敗します。
[EWOULDBLOCK] ファイルが既にロックされていて、 LOCK_NB オプションが指定された。
[EBADF] 引数 fd が無効なディスクリプタである。
[EINVAL] 引数 fd がファイル以外のオブジェクトを指している。
関連事項
open(2), close(2), dup(2), execve(2), fork(2)
NEWS-OSRelease 4.2.1R