> Linux Reviews > man >

flock


  1. flock.1.man
  2. flock.2.man


1. flock.1.man

Manpage of FLOCK

FLOCK

Section: User Commands (1)
Updated: November 2004
Index Return to Main Contents
 

名前

flock - ファイルロックを取得し、そのロックを保持するコマンドを実行する  

書式

flock [ --shared | --timeout=seconds ] lockfile command ..  

説明

flock(2) システムコールを使ってファイルロックを取得し、 そのロックを保持する指定されたコマンドを実行する。 指定するオプションにより、排他ロックにも共有ロックにもできる。 また、ロック競合が発生した際の動作は、 ロックが使用可能になるまで無限に待ち続ける (デフォルト) ように指定することも、 指定された時間の後にロックが使用可能にならなければ 失敗するように指定することもできる。 時間を 0 に指定すると、コマンドは (訳註: ロックの取得を) 全く待たない。

--shared
共有ロックを取得する。 共有ロックの取得は、他者による共有ロックの取得を停止させないが、 他者による排他ロックの取得を停止させる。 逆に、排他ロックの取得 (デフォルト) は、 他者による排他ロックの取得も共有ロックの取得も停止させる。 一般的には、 ロックされたデータをコマンドが単に読み込む場合には共有ロックが使用され、 ロックされたデータにコマンドが書き込みを行う場合には排他ロックが使用される。
--timeout=n
n 秒以内にロックが取得できない場合は、中止 (abort) する。 全くブロックせずにロックを取得したい場合は、 --timeout=0 と指定すること。 タイマーはロックの取得にのみ適用される。 ロックが取得されると、タイムアウトは直ちにキャンセルされる。 実行されるコマンドはタイムアウトの対象ではない。

 

例 (いくつかの仮想的なプログラムの呼び出し)

flock /etc/passwd read-and-write-to-passwd

flock --shared /etc/passwd just-read-something-from-passwd

flock --timeout=0 /sys /usr/local/bin/update-hotplug /sys  

著者

Written by Adam J. Richter


 

Index

名前
書式
説明
例 (いくつかの仮想的なプログラムの呼び出し)
著者

This document was created by man2html using the manual pages.
Time: 17:38:23 GMT, October 23, 2013

2. flock.2.man

Manpage of FLOCK

FLOCK

Section: Linux Programmer's Manual (2)
Updated: 2009-07-25
Index Return to Main Contents
 

名前

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 の動作であり、多くの他の実装でも起こる。)  

関連項目

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

カーネルソース内の Documentation/filesystem/locks.txt (以前のカーネルでは Documentation/locks.txt) も参照のこと。


 

Index

名前
書式
説明
返り値
エラー
準拠
注意
関連項目

This document was created by man2html using the manual pages.
Time: 17:38:23 GMT, October 23, 2013

SVENSKA - SVENSKA - SVENSKA - SVENSKA - pl - SVENSKA