PR
 
関数順 インデックス
目的別 インデックス

構文
 
 flock ファイル・ハンドル, 操作モード

返り値
 
 ロック成功時に真

説明

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

使用例

ファイルcount.datに記録されているアクセス・カウンタの数値を増やす(ブロックモードでロック)
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl ':flock';

my $file = 'count.dat';

# 読み書きモードでファイル・オープン
open my $fh, "+<", $file or die "$!:$file"; 
flock $fh, LOCK_EX; # 排他ロックをかける
my $count = <$fh>; # ファイルの値を読み込む
$count++;           # 数値を1増やす
seek $fh, 0, 0;     # ファイルの先頭に移動
print $fh $count;   # ファイルに値を書き込む
close $fh;          # ファイルをクローズする(ロックの解除も行う)
ファイルcount.datに記録されているアクセス・カウンタの数値を増やす(非ブロックモードでロック)
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl ':flock';

my $retry = 3; # ロックのリトライ回数
my $wait = 1;  # ロック再挑戦までの待ち時間

my $file = 'count.dat';

open my $fh, "+<", $file or die "$!:$file";

my $locked = 0; # ロックフラグ
for (my $i = 0; $i < $retry; $i++) {
  if (flock $fh, LOCK_EX|LOCK_NB) {
    $locked = 1;
    last;
  }
  sleep $wait;
}
die "Lock fail." unless $locked;

my $count = <$fh>;
$count++;
seek $fh, 0, 0;
print $fh $count;
close $fh;