共有ロックと排他ロックと

perldoc -f flock

http://perldoc.jp/func/flock

flock FILEHANDLE,OPERATION FILEHANDLE に対して flock(2)、またはそのエミュレーションを呼び出します。 成功時には真を、失敗時には偽を返します。

(中略)

OPERATION は LOCK_SH, LOCK_EX, LOCK_UN のいずれかで、LOCK_NB と 組み合わされることもあります。 これらの定数は伝統的には 1, 2, 8, 4 の値を持ちますが、Fcntl モジュールから シンボル名を独立してインポートするか、:flock タグを使うグループとして、 シンボル名をを使うことができます。 LOCK_SH は共有ロックを要求し、LOCK_EX は排他ロックを要求し、LOCK_UN は 前回要求したロックを開放します。 LOCK_NB と LOCK_SH か LOCK_EX がビット単位の論理和されると、flock は ロックを取得するまで待つのではなく、すぐに返ります; ロックが取得できたかどうかは返り値を調べます。

flock(2)

http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/flock.2.html

#include <sys/file.h>
int flock(int fd, int operation);  

オープンされたファイルにアドバイザリ・ロック (advisory lock) の適用 や解除を行う。 ファイルは fd で指定する。

(中略)

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

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

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

operation: LOCK_EX

ブロッキングな排他ロックを試してみる。

$ perl flock.pl 
proc(25676) - locked: true, waited time: 5 at flock.pl line 28.
proc(25677) - locked: true, waited time: 10 at flock.pl line 28

opration: LOCK_EX | LOCK_NB

ノンブロッキングな排他ロックだと、どうなるか。

proc(25940) - locked: true, waited time: 5 at flock.pl line 28.
proc(25941) - locked: false, waited time: 5 at flock.pl line 28

ノンブロッキングだから当たり前だが、flockで待たずにすぐ偽を返していることがわかる。