68user's page 掲示板

Prev< No. 1392> Next  [最新発言に戻る] [過去ログ一覧]
No. 1392 # ぷに辻 2000/11/20 (月) 22:58:33
返事どうもありがとうです。

> えっと、あの例では rename は使っていません。

よく見てませんでした。申し訳ないです。。

> もし rename でやるとしても、それ以前に複数のプロセスが
> tmp_file へ同時に出力しようとする可能性があるので、あの
> 部分全体を排他する必要があります。

なるほど。そこで、お教えいただいた通りにちょっと改造してみました。

# 毎回違う名前で作る
$tmp_file = 'bbs'.$$.'.tmp';

open(TMP_OUT,"> $tmp_file");
print TMP_OUT "発言者: $from<BR>\n";
print TMP_OUT "$now_date $host<BR>\n";
print TMP_OUT "$message<HR>\n";

open(IN,"$data_file");
while (<IN>){
    print TMP_OUT $_;
}
close(IN);
close(TMP_OUT);

# tmp_file の内容を $data_file にコピーするだけ
#open(TMP_IN,"tmp_file");
#open(OUT,"> $data_file");
#while (<TMP_IN>){
# print OUT $_;
#}
#close(TMP_IN);
#close(OUT);

# コピーのかわりに、$data_fileにrename
# その前に排他処理。
$lock_file = 'bbs.lock';
touch($lock_file);
open(IN,"$lock_file");
flock(IN, 2);
rename($tmp_file, $data_file);
close(IN);
unlink($lock_file); # 必要ない??

これで完璧ですか??
読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って
どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか??
改善点があればご教授くださいませ。
長文すみませんでした。

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