flock


flock FILEHANDLE, OPERATION

 FILEHANDLEと紐付いているファイルをロックします。
 ブロックモードでロックを行うと他のプログラムが既にロックを行っていた場合にそのロックが解除されるまで待ちます。非ブロックモードでロックを行うと、既にロックされていた場合ロック失敗ですぐに終了します。
 OPERATIONには以下の値を設定することができます。
 use Fcntl ':flock';を行うことで、OPERATIONに数字の代わりにLOCK_*を使用することができます。数字とLOCK_*の対応は以下の通りです。
数字 LOCK_* 意味
1 LOCK_SH 共有ロック(ブロックモード)
2 LOCK_EX 排他ロック(ブロックモード)
5 LOCK_SH | LOCK_NB 共有ロック(非ブロックモード)
6 LOCK_EX | LOCK_NB 排他ロック(非ブロックモード)
8 LOCK_UN ロック解除
 OPERATIONに8(またはLOCK_UN)を指定するとロックを解除しますが、closeを実行した時にもロックの解除が行われるので、OPERATIONに8を指定するケースは少ないです。

サンプルプログラム

use strict;
use warnings;
use Fcntl ':flock';

my $file = 'counter.dat';

open my $fh, "+<", $file or die "$!:$file";
flock $fh, LOCK_EX;
my $count = <$fh>;
$count++;
seek $fh, 0, 0;
print $fh $count;
close $fh;

関連項目

・close関数
open関数