Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all bug

名前

       flock - オープンされたファイルに対するアドバイザリロックの適用、解除を行う

書式

       #include <sys/file.h>

       int flock(int fd, int operation);

説明

       オープンされたファイルにアドバイザリロック  (advisory lock) の適用 や解除を行う。 ファイル
       は fd で指定する。引き数 operation には以下のいずれか一つを指定する:

           LOCK_SH  共有ロックを適用する。 指定したファイルに対して、  一つ以上のプロセスが同時に
                    共有ロックを保持することができる。

           LOCK_EX  排他ロックを適用する。  指定したファイルに対して、 ただ一つのプロセスだけが同
                    時に排他ロックを保持することができる。

           LOCK_UN  このプロセスが保持している既存のロックを解除する。

       flock()  を呼び出したときに、指定したロック種別と異なるロックが別プロセスによって 保持され
       ていると、  flock()  は停止 (block) されることがある。 非停止 (nonblocking) タイプの要求を
       行うためには、 上記の操作 (operation) に LOCK_NB を論理和の形で指定する。

       一つのファイルに共有ロックと排他ロックを同時に設定することはできない。

       flock()  によって作られるロックは、 オープンされたファイルのテーブルエントリと関連付けられ
       る。  したがって、ファイルディスクリプタの複製  (fork(2)  や dup(2)  などにより作成される)
       は同じロックを参照し、 これらのファイルディスクリプタのどれを使っても このロックを変更した
       り解放したりできる。 また、ロックの解放は、 上記の複数のファイルディスクリプタのいずれかに
       対して 明示的に LOCK_UN 操作を指示した場合か、これらのファイルディスクリプタがすべて  閉じ
       られた場合に行われる。

       あるプロセスが open(2)  (もしくは同様の方法) を使って同じファイルに対して 複数のディスクリ
       プタを取得した場合、 flock() はこれら複数のディスクリプタを各々独立のものとして扱う。 これ
       らのファイルディスクリプタの一つを使ってファイルをロックしようと    した際、そのロック要求
       は、呼び出し元のプロセスがそのファイルの別の  ディスクリプタ経由ですでに設定しているロック
       によって拒否される場合がある。

       一つのプロセスは、一つのファイルに対して  (共有ロックと排他ロックのうち)  いずれか一種類の
       ロックしか設定できない。  既にロックされたファイルに対して  flock()   を呼び出すと、既存の
       ロックを新しいロックモードに変更することになる。

       flock()  により作成されたロックは execve(2)  の前後で保存される。

       共有ロックも排他ロックも、ファイルがどのモードでオープンされたかに  関係なく適用することが
       できる。

返り値

       成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。

エラー

       EBADF  fd がオープンされたファイルディスクリプタではない。

       EINTR  ロックの獲得を待っている間に、ハンドラにより捕捉されたシグナルを  受信し、  flock()
              が中断された。 signal(7)  参照。

       EINVAL oepration が無効である。

       ENOLCK ロックレコードを割り当てるためのメモリが不足している。

       EWOULDBLOCK
              指定したファイルがロックされており、 LOCK_NB フラグが指定されている。

準拠

       4.4BSD  (flock()  コールは 4.2BSD で最初に登場した)。 fcntl(2)  で実装されているものなどを
       含めると、 flock()  の機能はほとんどの UNIX システムで実装されている。

注意

       flock()  は NFS 上のファイルのロックをしない。代わりに  fcntl(2)  を使用すること。これによ
       り、十分に新しいバージョンの  Linux と、ロック機能を サポートした NFS サーバを使用すること
       により、NFS 上でロックができる。

       kernel 2.0 以降では、 flock()  は、GNU C ライブラリでの fcntl(2)  を呼び出してのエミュレー
       ションではなく、  それ自体がシステムコールとして実装されている。  これにより正真正銘の BSD
       での動作が達成される: flock()  と  fcntl(2)   で適用されるロックの種別には相互作用がなくな
       り、 flock() がデッドロックを検出しなくなる。

       flock()  アドバイザリロックだけを適用する。したがって、ファイルに適切なアクセス権を 付与し
       ていれば、プロセスは flock() の使用に無視して、ファイルへの入出力を行うことができる。

       flock()  と fcntl(2)  は fork されたプロセスと  dup(2)   で違った動作をする。  flock()  を
       fcntl(2)   を使って実装しているシステムでは、 flock() の動作はこのマニュアルページに記載さ
       れているものとは違うだろう。

       ロックの変換 (共有ロックから排他ロックへ、もしくはその反対) がアトミックに  行われることは
       保証されていない:  既存のロックがまず削除され、それから新しい ロックが設定される。この 2つ
       のステップの間に、他のプロセスからの処理待ちの  ロック要求が認められるかもしれず、結果とし
       て変換は停止  (block)  したり、  (LOCK_NB  が指定された場合には)  失敗したりする。 (これは
       元々の BSD の動作であり、多くの他の実装でも起こる。)

関連項目

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

       Linux    カーネルソース内の     Documentation/filesystem/locks.txt     (以前のカーネルでは
       Documentation/locks.txt)

この文書について

       この  man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。