ロック処理について

[上に] [前に] [次に]
じぇい 1999/05/18(火) 16:20:36
聞くは一瞬の恥、聞かぬは一生の恥ということで恥をしのんで毎回すごく基本的なことを聞いているものです。(独学なもので近くに質問できる人がいません。)

ロック処理についてお聞きしたいのですが、CGIでよくロックフォルダを作成してロック処理をしているプログラムを見かけるのですが、flockだけではロック処理は十分じゃないのですか?

あと、これは関係無いのですが、今スクリプトを作っていて、書きこみ処理で、

$new_data = ($f_msg,$f_name,$f_mail,$f_url,$f_title,$date\n);

open(OUT, '+< $bbs_dat');
flock(OUT, 2);
@all_data = <OUT>;
unshift(@all_data, $new_data);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT @all_data;
close(OUT);

このような処理をしているのですが、ちょっと不安だったので質問しました。誤りがあれば教えてください。
(毎回毎回基本的なことですいません。)

Syn [E-Mail] 1999/05/18(火) 17:20:23
わたしもその方法 (flock 〜 truncate 〜 seek 〜 print) です。
さしあたっていまのところログが飛んだりはしていないので
問題なしとしています。
よくいわれることですが いくら手を尽くしてもカンペキなロック
はできないので 手間と効果のトレードオフですね。

じぇい 1999/05/19(水) 00:58:26
なんか上で変なこと書いてました。^^;

$new_data = ($f_msg,$f_name,$f_mail,$f_url,$f_title,$date\n);

ではなく、

$new_data = "$f_msg,$f_name,$f_mail,$f_url,$f_title,$date,\n";

ですね。

しかし、、、

$new_data = "$f_msg,$f_name,$f_mail,$f_url,$f_title,$date,\n";
open(OUT, '+< $bbs_data');
flock(OUT, 2);
@all_data = <OUT>;
unshift(@all_data, $new_data);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT @all_data;
close(OUT);

これではいくら書きこんでもファイルに何も記録されません。
一体何が原因なのでしょうか、、?

ここに原因があると思うのですが、ここに原因が無いのならばそう教えてください。

ふじ 1999/05/19(水) 01:17:28
open(OUT, '+< $bbs_data');

これだと、$bbs_dataが展開されないからでは?
open(OUT, "+< $bbs_data");
こうじゃないですかね。
openなどの戻り値はきちんとチェックした方が良いですよ。
例えば
unless(open(.....)){
print "can't open $!";
exit(0);
}
てな感じで。

じぇい 1999/05/19(水) 02:25:25
すいません。
なんかとんでもない基本的なミスをしてたようです。
どうもありがとうございました。
ロック処理に付いてはもうちょっと情報がほしいので解決は押さないでおきます。

なえ 1999/05/19(水) 08:39:31
ロック処理に関しては、flockが使えるならそれが一番いいと思います。
もしも使えないなら、シンボリックリンクを利用するのがいいんじゃないかな。

ふじ 1999/05/19(水) 14:40:23
../199903/99030145.htm

じぇい 1999/05/19(水) 21:20:19
[[解決]]
>なえさんへ
シンボリックリンクによるロック処理については後で聞こうと思っていたところでした。
flockが使えるならそれが一番いいんですね。どうもありがとうございました。

>ふじさんへ
なるほど。えらく詳しく討論していますね…。
読んでみます。

[上に] [前に] [次に]