List of ./lock/flocks.cgi

Wed Apr 24 03:04:26 2024

戻る

TEXTAREA で表示(カット&ペーストむき)

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

戻る