たとえばカウンタなどを作ろうと思ったとき、データを保存する
ファイルを2重にアクセスできないようにするために、ロックファ
イルを用意するのが一般的だと思います。
しかし、単にロックファイルを作って、それを

if (-e $lockfile) {~~}

などとやっても、けっこう頻繁に2重アクセスされてしまいます。
実際、以前、1000アクセス/日あるページを運営していたとき、上の
方法では3日に1回は壊れました。

上の方法は、理論上はありえないはずなのに、なぜおこるのでしょうか?

また、ロックファイルではなくロックディレクトリを作って、

unless (mkdir ("./lock", 0777)) {~~}

と行うことによっても、同様の判定が可能かと思いますが、
こちらの方法でもやはり2重アクセスが発生してしまうことが
あるのでしょうか? その確立は、ロックファイルと同一レベル
でしょうか? また、発生するならば、ディレクトリシステム上に
同じ名前のディレクトリが2つ存在することになるのでしょうか?

もしわかる方がいらっしゃいましたら、ぜひ教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

下記のページが、非常に参考になります。


(左記:とほほのWWW入門、右記:大崎博基氏のHP)

なぜ壊れてしまうのか、については左記のHPを、
壊れない方法については両方のHPを参考にしてみてください。

1000Page/day程度のアクセスで壊れることはなくなるでしょう。

参考URL:http://tohoho.wakusei.ne.jp/wwwcgi8.htm , http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
    • good
    • 0
この回答へのお礼

ありがとうございます!

さっそく参照してみたところ、期待していた以上の情報を得ることが
できました。おそらくは何の問題もなくロックできそうな気がします。

こんなとびっきりの情報をいただいておきながらナンですが、
万が一のためにも、今日いっぱいだけ受け付けさせてください。

お礼日時:2001/05/24 07:25

ファイルのオープン時は、多分


・lockfileの生成
・データファイルのオープン
・lockfileがあるかを判別し、条件分岐
という順番で手続きを取っていると思いますが、ファイルクローズ時はどういう順番で閉じられてますか?
補足お願いします

この回答への補足

全体の流れとしては、

1) ロックファイルについての条件分岐
2) ロックファイルの生成
3) データファイルのオープン
4) データ読み出し&処理
5) データファイルへの書き込み
6) データファイルクローズ
7) ロックファイル消去

の順番で行っています。

ご指摘のように、ロックファイル生成の後で
ロックファイルがあるかどうかを判別するのは、
アルゴリズム的に矛盾があったりしませんか?

補足日時:2001/05/24 07:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング