WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:Tripod(米)でのロック処理

0:[投稿] kzhr [MAIL] [URL] [2002/03/14 21:56 ][環境:WIN+NN UNIX系+Perl]

こんにちは、kzhrです。

今アメリカのTripodサーバーでCGIを利用していますが、そこでは
system
exec
fork
chown
chmod
sleep
unlink
kill
eval
All commands involving sockets
以上の関数が使えません。 そこで以下のロック処理を考えました。

sub l_fle{
    local($tmpfile) = $datafile;
    $tmpfile =~ s/(\w+)\.\w+$/$1\.tmp/i;
    srand();
    local($flag) = 0;
    foreach(1 .. 10){
        unless (-f $tmpfile){
            if(open(TMP,">$tmpfile")){
                print TMP "$datafile TMP File\n";
                close(TMP);
                if(open(D_FIL,">>$d_loc")){
                    print D_FIL @t_fle
                }else{ &s_err('1'); }
                rename($tmpfile,$d_loc);
                last;
            }
        }
        $tmpflag = 1;
    }
    $flag;
}
これで衝突しにくくなるか見ていただきたいと思います。
なお参考文章は、
http://www.tripod.lycos.com/guides/cgi.htmlです。


1:[回答] TOM neko [2002/03/14 22:10 ]

flockは使えませんか?


2:[回答] ふじ [URL] [2002/03/14 22:48 ]

$flag $tmpflag は何に使っているのか?
$d_loc @t_fle てのはどこから来てるのか?
srand() する意味は?
など、よくわからないところがあるのですが・・・

しかも、
rename($tmpfile,$d_loc);
としたら、$d_loc (ロックしたいファイルのファイル名?)
というファイルの中身は "$datafile TMP File\n"
になりますけど、多分それは望んだ動作じゃないですよね。

まあそれはともかく、
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
こちらが参考になるでしょうか。

ロック処理の際には、
(1)ロックできるかどうか調べる
(2)ロックする
の(1),(2)を同時に処理できる(atomicな)方法を使う必要があります。
-f でロックファイルの存在を確認してから(1)
open でロックファイル作成(2)
のように2つの処理でやろうとすると、実はロックにならないので注意。


3:[回答] kzhr [MAIL] [URL] [2002/03/15 21:02 ]

Tripodはflockが使えるようです。 ですが、引越ししたときのことを考えて、一時ファイルを使ったロックを考えています。

(1)一時ファイルの存在確認して無ければ作る。あれば待つ。(どうやって待てば…)
(2)作ったら書く
(3)データファイルにリネームする。
(4)おわり

以上のような流れでいいんでしょうか・・・?


4:[回答] ふじ [URL] [2002/03/15 21:19 ]

> (1)一時ファイルの存在確認して無ければ作る。
ですから、それじゃダメなんです。
普通のファイルの存在確認と作成は atomic に(一動作で)できないので。

mkdir や、symlink なら、存在確認と作成を atomic な動作として
できるので、ロックに使えます。
が、単純に作るとロック中にプロセスが死んだりした場合の
アンロックに問題がでます。

で、そこらへんの対処までしている例として
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
ここを紹介したのですが、読まれましたか?


5:[回答] TOM neko [2002/03/16 00:37 ]

sleepかselectが使えないと待つのは難しいかも。flockが使えるなら待つのは自動で簡単だし、引っ越し先でsleepが使えるなら、そのときに一時ファイル式に書き替えてもいいんじゃないでしょうか。

排他制御の基本ならここでも(宣伝)
http://homepage1.nifty.com/glass/tom_neko/web/web_04.html


6:[完了] kzhr [MAIL] [URL] [2002/03/16 18:25 ]

>>4
今のサーバーの状態では、Perlメモのやり方が効率がよさそうです。(link関数を使ってもよいのですが・・・symlinkとどう違うのでしょうね。。。)
今回はディレクトリ式ロックで行こうと思います。

>>5
今でも結構つかえるので引越しはいつか決まっていません。 sleepが使えるようならそれを使ってみたいと思います。

またお手伝いいただきありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World