68user's page 掲示板

Prev< No. 99> 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の前は「エンマーク」でいいのですよね。

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

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