WEB相談室

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

タイトル:flockの使い方

0:[投稿] かおる [2006/07/15 08:21 ] [環境:IE6,WinXP Apache,perl]

flockの使い方について質問です。
=====================================
local($tmpfile) = "$datadir/temp.tmp";
    open(TMP, "+<$tmpfile");----(1)
    flock(TMP, 2);
    truncate(TMP, 0);
    seek(TMP, 0, 0);
   〜書き込み処理〜
    close(TMP);
    
    local($filename) = sprintf("%s/%04d%02d", $datadir, $_[0], $_[1]);
    # バックアップファイル作成
    local($file) = $filename . ".txt";
    local($file0) = $filename . ".000";
    local($file1) = $filename . ".001";
    local($file2) = $filename . ".002";
    
    if (-f $file1) {
        rename($file1, $file2) || &Error("Rename Error $file1 to $file2");
    }
    if (-f $file0) {
        rename($file0, $file1) || &Error("Rename Error $file0 to $file1");
    }
    if (-f $file) {
        rename($file, $file0) || &Error("Rename Error $file to $file0");
    }
    #if (-e $file) {
    rename($tmpfile, $file) || &Error("Rename Error $tmpfile to $file");---(2)
    chmod(0666, $file);
    #}
    if (-e $tmpfile) {
        unlink($tmpfile);
    }
=====================================
(1)だと(2)のところでエラーが出ます。
(2)をopen(TMP, "+>$tmpfile");にするとエラーは出ませんが、ロックがうまくかかりません。
flockを使う場合、正しくはopen(TMP, "+<$tmpfile");とすべきと思うのですが、上記スクリプトはどこが間違っているのでしょうか?ご指摘ください。

したいと思うことは、、、
temp.tmpへデータを書き込み、そのバックアップを三代にわたって残したいのです。
その場合、temp.tmpにロックをかけ、排他処理をさせたいと思っています。


1:[質問] かおる [2006/07/15 08:25 ]

>(2)をopen(TMP, "+>$tmpfile");にするとエラーは出ませんが、ロックがうまくかかりません。

正しくは(1)の間違いです。訂正いたします。


2:[回答] miz [2006/07/15 21:03 ]

1.flockはファイルを閉じた時点で解除されるので、renameの時には排他制御にならない。
別にflock用のダミーファイルを作るか、symlinkかmkdirで排他制御すべきでしょう。
2.rename時に temp.tmpの modは0644あたりだと思うけど、rename先の$fileは0666になってるので、権限が違うというエラーが出てるのでは?
先にtemp.tmpの modを0666にしておくべき。そうすれば、後からchmod(0666, $file); を実行する必要はない。
エラー内容も示して貰った方がよいかと思います。


3:[質問] かおる [2006/07/16 07:19 ]

miz様ご回答ありがとうございます。

>エラー内容も示して貰った方がよいかと思います。
エラーというのは「 || &Error("Rename Error $tmpfile to $file");」が表示(実行)されてしまうという事です。
=>rename($tmpfile, $file)実行時のエラー?
open時にtemp.tmpを空にして開く(+<)か、開いてから空にする(truncate)かで(2)のrenameの動作がどう影響するのかが理解出来ません。

※運用面での必要性ではなくて、データファイルの破損防止目的でflockを使うのであれば、バックアップは必要ないのでしょうか?


[戻る]