#!/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"; }