[Perl] 行数制限のあるログファイルに安全に1行追加する方法は?

[上に] [前に] [次に]
とん平 2000/02/25(金) 03:02:08
logfileの先頭に$dataを追加して、最終的に$max行になるようにしたいので、
以下のスクリプトを書いてみました。
正しく動作はしていますが、close(LOG)とrenameの間に別プロセスが割り込んだときが
心配です。
そこで、flockが100%効くという前提で、どのようにしたら完璧かご教授ください。

open(LOG, "logfile");
flock(LOG, 2);
open(TMP, ">>tmpfile");
print TMP $data;
$i = 1;
while (<LOG>) {
print TMP $_;
if (++$i == $max) {
last;
}
}
close(TMP);
close(LOG);
unlink("logfile");
rename("tmpfile", "logfile");

しなのむし 2000/02/25(金) 04:27:22
あらかじめロック用のファイルを用意する。

open(LOCK "ロック用のファイル");
flock(LOCK,2);

様々な処理

close(LOCK);

# flockが100%効くという前提で・・・

しなのむし 2000/02/25(金) 04:41:59
>open(LOCK "ロック用のファイル");
open(LOCK, "ロック用のファイル");

配列に読み込んでも良いのなら
open(LOG, "+< logfile");
としてtmpfileを作らないとか。

Ichi 2000/02/25(金) 05:50:22
truncateできるのなら、
# (tmpfile作成終了)
truncate(LOG,0); # LOGの長さを0(空)にする
seek(LOG,0,0);
seek(TMP,0,0);
while (<TMP>) {
print (LOG $_)
}
close(LOG);
close(TMP);

とか。

Ichi 2000/02/25(金) 05:52:55
一応訂正。
>print (LOG $_)
print (LOG $_);
です。

しなのむし 2000/03/05(日) 05:45:39
>open(LOCK "ロック用のファイル");
>flock(LOCK,2);

open(LOCK ">ロック用のファイル");
flock(LOCK,2);
に修正。

Read onlyで開いた時に書き込みロックしても効かないようだ・・・

しなのむし 2000/03/05(日) 05:47:38
また、","が抜けてた。。。

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