ソフト開発塾

KONDO-NETサーチ(KLSH)
- 新着 - VB - VC - Perl - PHP - カテゴリに登録 -

Linux

Perlでの排他制御(lock)その3


通常、「データ更新」と「データ表示」のトランザクションがある。
「データ表示」は、読み込みだけであるため、排他制御は必要ない。
データ更新のトランザクション[TR1]

	open IN, '<','累計金額' or die "オープン失敗 $!";
	$sum = ;
	close IN;

	$sum += 100;

	open OUT, '>','累計金額' or die "オープン失敗 $!";
	print OUT $sum;
	close OUT;

表示だけのトランザクション[TR2]

	open IN, '<','累計金額' or die "オープン失敗 $!";
	$sum = ;
	close IN;

	print "$sum\n";

を、flockで問題なようにするには、flockのLOCK_SH=1、LOCK_EX=2を使用する。
データ更新のトランザクション[TR1]

	open INOUT, '+<','累計金額' or die "オープン失敗 $!";
	flock INOUT,2;

	$sum = ;

	$sum += 100;

	truncate INOUT, 0;	# ファイルサイズを0バイトにする
	seek INOUT, 0, 0;	# ファイルポインタを先頭に移動
	print INOUT $sum;

	close INOUT;

表示だけのトランザクション[TR2]

	open IN, '<','累計金額' or die "オープン失敗 $!";
	flock INOUT,1;
	$sum = ;
	close IN;

	print "$sum\n";
[TR2]だけが、同時起動された場合、flockにより停止することはない。
[TR2]のflock INOUT,1が有効な時、[TR1]のflock INOUT,2で停止し、また [TR1]のflock INOUT,2が有効な時、[TR2]のflock INOUT,1で停止する。
また、eval { flock(OUT, 2); };のように、evalで、flockを行っているスクリプトを見かける。 これは、flockが、実装されていない場合、 perl が異常終了するのを防ぐ目的であるようも思えるが、 実装されていない場合など、正常にflockできていないことをであり、 排他制御を行っていないのと同じであることを忘れてはならない。

ソフト開発塾 ソフト開発塾(LINUX)
---KONDO-NET.GR.JP---