#!/usr/bin/perl
#
# flocks.cgi
# 1998/08/20 Ver.0.00
# 1998/08/24 Ver.0.01
# 1998/09/30 Ver.0.02
# 1998/10/20 Ver.0.03 bugfix
# 2008/08/16 Ver.0.04 bugfix
#
# (C) 1998,2008 がま <gama@mvg.biglobe.ne.jp>
$LOCK_EX = 2; # 排他的にロック
$LOCK_UN = 8; # ロックを解除
#/////////////////////////////////////////////////////
$dir='./data/';
$ext='.dat';
$maxi=10;
$maxj=200;
{
$|=1;
($test,$n) = split('&',$ENV{'QUERY_STRING'});
$ctrdat=$dir.$n.$ext; # 実験用カウンタファイル名
print "Content-type: text/html\n\n",
'<HTML><BODY>',
'<H2>flock の動作</H2><HR>',
'<B>Perl Version ', $], "</B><BR>",
'<B>実験 ', $test, "</B> : ";
if ( $test == 0) {
print '誤動作の例 共有制御をしない';
} elsif ($test == 1 ) {
print '誤動作の例 close する前にアンロック';
} elsif ($test == 2 ) {
print '正常な動作例 バッファを書き出してからアンロック';
} elsif ($test == 3 ) {
print '正常な動作例 close によって暗黙にアンロック';
}
print "<BR>\n", '実験用ファイル名 : ', $ctrdat, "\n";
print "<HR>\n";
print ' 左右のフレームで、各',
$maxj*$maxi,
'回カウントアップし、ファイル内容の変化を表示します。<BR>';
if ( $test == 0 or $test == 1 ) {
print ' カウンタは ',
$maxj*$maxi*2,
' にならず、誤動作している様子が表示されている...と願ってます(^^;;;';
} else {
print ' どちらかに表示されるカウンタの最後が ',
$maxj*$maxi*2,
' になり、正常に動作している...と思う(^^;;;';
}
print "<HR>\n";
print "<PRE>\n";
$i=0;
# open(FCTR,"+<$ctrdat");
# printf "%4d:<B>%s</B>\n", $i*100, <FCTR>;
# close(FCTR);
while ( $i++ < $maxi) {
$j=0;
while ( $j++ < $maxj) {
open(FCTR,"+<$ctrdat"); # <<<< open
if ( $test == 0 ) { # 実験0 アクセス制御をしないと、誤動作する。
# なにもしない
} else { # 実験1、2、3
flock(FCTR,$LOCK_EX); # ロック
}
$num=<FCTR> + 1;
seek(FCTR, 0, 0);
printf(FCTR "%d", $num);
if ( $test == 0 ) { # 実験0 アクセス制御をしないと、誤動作する。
# なにもしない
} elsif ( $test == 1 ) { # 実験1 close する前にアンロックすると、誤動作する。
flock(FCTR,$LOCK_UN); # アンロック
} elsif ( $test == 2 ) { # 実験2 バッファを書き出してからアンロックすると、正常に動作する。
select(FCTR); # FCTR をセレクトする
$|=1; # FCTR をバッファリングしないようにする
select(STDOUT); # STDOUT に戻す
print FCTR ''; # バッファを書き出す
flock(FCTR,$LOCK_UN); # アンロック
} elsif ( $test == 3 ) { # 実験3 close するとアンロックされるので、正常に動作する。
# アンロックしない
}
close(FCTR); # <<<< close
}
printf "%4d:<B>%s</B>\n", $i*$maxj, $num;
}
print "</PRE>\n";
print "<HR>\n";
}