68user's page 掲示板

Prev< No. 99〜100> Next  [最新発言に戻る] [過去ログ一覧]
No. 99 # 68user 1999/01/28 (木) 23:30
僕が現時点で一番いいと思う方法は、シンボリックリンク自身に
プロセス番号の情報を埋め込み、もしリンク作成できなかったら
リンク先を調べて、さらに「/proc/プロセス番号」が存在するか
どうかチェックする、ってのです。もし/proc/プロセス番号 が
あれば、本当に実行中なわけですが、存在しなければ誤って
ロック情報だけが残ってしまったわけで。

また、
    $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish;
    sub finish{
        ロックファイルを削除;exit;
    }
などと書くことで、誰か(WWWサーバなど)にシグナルを送られて
プロセスを止められた場合にも、ロックファイルの後始末だけは
行って終了できます。

ただ、うちのカウンタはいろいろ試しているんですが、いまいち…です。
# CGIの場合、排他処理の失敗自体がたまにしか起きないので、
# 動作チェックしにくいですよね。

例えばこんな感じ。

BEGIN { &lock_on; }
END { &lock_off; }

sub lock_on {
    $SIG{TERM}=$SIG{INT}=$SIG{HUP}=$SIG{QUIT}=\&lock_off;
    my $lock_flg = 0;
LOOP:
    foreach ( 1..3 ){
        foreach ( 1..5 ){
            $lock_flg = symlink("$$",$lockfile);
            if ( $lock_flg ){ last LOOP; }
            sleep 1;
        }
        if ( ! $lock_flg ){
            if ( ! -f "/proc/".readlink($lockfile) ){ # なぜかロックファイルが残ってた
                各種整合性のチェック;
                unlink($lockfile);
            }
        }
    }
    if ( ! $lock_flg ){
        print "ロックファイルを作成できませんでした。\n";
        exit;
    }
}

sub lock_off {
    unlink($lockfile);
    その他の後始末;
    exit;
}

> そうですか、まだ「これ!」ってセオリーは無いんですね(^^ゞ

たぶんセオリーはあるんでしょうけど、僕が知らないだけです(^^;


> hogeの前は「エンマーク」でいいのですよね。

全角の「¥」ではないですよ。半角の「\」です。
エンマークかバックスラッシュかは、表示される環境によります。

No. 100 # M.Masuda [E-mail] 1999/01/29 (金) 15:52
>たぶんセオリーはあるんでしょうけど、僕が知らないだけです(^^;
いやいや、これだけ知ってれば十分じゃ....この概念は私的でした
ね(^^ゞ

私のプログラミングは、BASICから入ってるのでいまだに構文の書
き方は、BASIC風です。(^^;
しかも、Perlもフリーで配布しているCGIを解析して構文の記述を
勉強したりしてるので、Perl4やそれ以前の頃からプログラミング
している人から比べたら、恥ずかしくって自分のプログラムなんて
公開できない。(T_T)

まだまだ奥が深いPerlは、これだけを勉強して立派なPerl使いにな
りたいんだけど、仕事柄これだけをやってるわけにいかないのが辛
いところです。(^^;

今同時進行で勉強してるのが、Perl,JavaScript,DHTNL,ネットワーク
関連、最近勉強を始めたDHTMLは、IEとネスケの互換性の無さにあき
れています、ページを2重化したくないので同じページ内でIE・ネス
ケそれぞれ3と4のバージョンで無難に表示させるのにてこずってま
す。(^^;

ところで以下の構文がまだよく分からないので、教えて下さい(T_T)
【1】
$SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish;
↑何をしているのか解からない(恥)
シグナルハンドラをいじっているのは解かるんだけど、
hoge=foo=fuge=booの '=' の使い方の意味と、\&finishの'\'がリファ
レンスを指す事は解かるんだけど、なぜ'\'そうするのかが解からない
【2】
my $lock_flg = 0; ←localとmyの使い分けがまだ理解できない

アー恥ずかしかった。(^^ゞ


この使い方は勉強になりました。
>$lock_flg = symlink("$$",$lockfile);
>if ( $lock_flg ){ last LOOP; }
こんなに簡単に書けるんですね!φ(._.)

># CGIの場合、排他処理の失敗自体がたまにしか起きないので、
># 動作チェックしにくいですよね。
早いマシンより、遅いマシンに負荷が集中する時にエラーが出やす
いんでしょうね。

ちなみに私の試験方法は、同じページ上に同じカウンタのURLを沢山
書いて、ブラウザのキャッシュを無効にしてリロードです。
#本当にこれでいいのか解からないけど、他に手段を知らない(^^ゞ

ではまた。

Prev< No. 99〜100> Next  [最新発言に戻る] [過去ログ一覧]