たとえばカウンタなどを作ろうと思ったとき、データを保存する
ファイルを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と関連する良く見られている質問

Qa.menu:visited {~~}

こんばんは。css勉強中、
a.menu:visited
a.menu:hover
というものが出てきたのですが、
これはどういう意味で、なんというタイプの言語でしょうか?
html、cssではないですよね。

Aベストアンサー

CSSです。
http://www.nextindex.net/web/CSS/pseudo.html

Qmkdirでのファイルロック

以前にも質問したのですが間違って締めきってしまったので再度質問します。CGI初心者なのですがmkdirを使ってファイルロックをかけたいのですがどうすればいいのかわかりません。たぶん、下記の部分というのはなんとなくわかりました。
分かる方よろしくお願いします。


#### メッセージ番号設定 ####
sub getnumber {
open(COUNTER,"$countfile") || &error('カウントファイルが開けない');
$this_num = <COUNTER>;
close(COUNTER);

$this_num++;

open(COUNTER,">$countfile") || &error('カウントファイルに書きこめない');
print COUNTER "$this_num";
close(COUNTER);

if( length($this_num) == 1 ){ $this_num ="000000" . $this_num;}
elsif( length($this_num) == 2 ){ $this_num ="00000" . $this_num; }
elsif( length($this_num) == 3 ){ $this_num ="0000" . $this_num; }
elsif( length($this_num) == 4 ){ $this_num ="000" . $this_num; }
elsif( length($this_num) == 5 ){ $this_num ="00" . $this_num; }
elsif( length($this_num) == 6 ){ $this_num ="0" . $this_num; }
}

#### データファイルへ入力 ####
sub inputDB {
$datafile = "$predatadir/userdata01.csv";
open(DB,">>$datafile") || &error('データファイルに書きこめない');
print DB "$yourname,$email\n";
close(DB);
}

以前にも質問したのですが間違って締めきってしまったので再度質問します。CGI初心者なのですがmkdirを使ってファイルロックをかけたいのですがどうすればいいのかわかりません。たぶん、下記の部分というのはなんとなくわかりました。
分かる方よろしくお願いします。


#### メッセージ番号設定 ####
sub getnumber {
open(COUNTER,"$countfile") || &error('カウントファイルが開けない');
$this_num = <COUNTER>;
close(COUNTER);

$this_num++;

open(COUNTER,">$countfile") || &error('カ...続きを読む

Aベストアンサー

 #1です。

 おそらく修正なさったプログラムで大丈夫だと思います。が、素人判断ですので、他の方からの回答をしばらくお待ちになるか、あるいは思い切って実践に移して様子をみるか、最終的にはご自分で判断なさって下さい。実践に移す場合は、念のため少なくともデータファイルだけは(できれば全てのファイルの)バックアップをとっておくとよいと思います。

 以下、気づいた点を書きます。あくまでも素人の意見なので、参考程度に受け取って下さい。

・ロックはファイル出力時は必要ですが、入力時は不要かもしれません。つまり、プログラムのはじめの方、カウンタのファイルをリードするところでは、ロックはなくても良さそうです。

・「userdata01.csv」はおそらくカウンタのファイルに比べてとても大きいと思われますが、あまり大きすぎてその処理に時間がかかると、その処理のきっかけとなるアクセスをした人が、途中でブラウザの「中止」を押した場合、ロック状態のままになったり、ファイルが壊れたりする不具合があるかもしれません。(心配しすぎかも!?)

 それから、余計なお節介ですが、$this_numが6桁以下の場合、頭に0をつけて7桁にするif-elsif-...のところは、次のようにすれば1行で済みます。

  $this_num = sprintf("%07d", $this_num);

 長くなってしまいすみません。では。

 #1です。

 おそらく修正なさったプログラムで大丈夫だと思います。が、素人判断ですので、他の方からの回答をしばらくお待ちになるか、あるいは思い切って実践に移して様子をみるか、最終的にはご自分で判断なさって下さい。実践に移す場合は、念のため少なくともデータファイルだけは(できれば全てのファイルの)バックアップをとっておくとよいと思います。

 以下、気づいた点を書きます。あくまでも素人の意見なので、参考程度に受け取って下さい。

・ロックはファイル出力時は必要ですが、入...続きを読む

Qサーバ上のロックディレクトリを削除したい

サーバにアップしましたcgiのディレクトリ(フォルダー)を削除しようとしたのですが、
FTPから、どうしても削除出来ないディレクトリがあります。
そのディレクトリとは、下記のツリーにあります、lockディレクトリなんです。lockディレクトリ以下を全部消したいのです。

ルートディレクトリ(プロバイダは@Niftyです)
・・ │
・・ │---cgi-bin
・・・・・ │
・・・・・ │---joyfulディレクトリ(KENT WEBの"掲示板"です)
・・・・・・・・・ │
・・・・・・・・・ │---lockディレクトリ
・・・・・・・・・・・・ │
・・・・・・・・・・・・ │---joyful.lockディレクトリ
・・・・・・・・・・・・・・・・ │
・・・・・・・・・・・・・・・・ │---名前がないディレクトリ(下にファイル何も無し)
(階層をそのままUPしますと、全部左に寄ってしまいますので、
ドットを入れてあります)

このlockディレクトリを削除するため、ウェブで検索したところ、下記のような削除用スクリプトを発見しました。

そこで質問なのですが、

"$delete_dir = "/home/member/ユーザーID/public_html/消したいディレクトリ名/";"
ここのところは具体的にどのように書けばよいのでしょうか?

そして、このスクリプトはどこに置けばよいのでしょうか?

言葉が足りなければ、補足致しますので、宜しくお願い申し上げます。

削除用スクリプトはこちらにありました。
http://oshiete1.goo.ne.jp/qa1739409.html

サーバにアップしましたcgiのディレクトリ(フォルダー)を削除しようとしたのですが、
FTPから、どうしても削除出来ないディレクトリがあります。
そのディレクトリとは、下記のツリーにあります、lockディレクトリなんです。lockディレクトリ以下を全部消したいのです。

ルートディレクトリ(プロバイダは@Niftyです)
・・ │
・・ │---cgi-bin
・・・・・ │
・・・・・ │---joyfulディレクトリ(KENT WEBの"掲示板"です)
・・・・・・・・・ │
・・・・・・・・・ │---lockディレクトリ
・・・・・・・...続きを読む

Aベストアンサー

わかりにくく書いてしまい失礼しました。
以下のスクリプトを試してみてください。
削除に行く前にlockディレクトリ以下のパーミションを再帰的に変更するようにしました。

#!/usr/local/bin/perl

$delete_dir='./lock/';
`chmod -R 757 $delete_dir`;
`rm -rf $delete_dir`;

print "Content-type: text/html\n\n";
print "END\n";
__END__

Qアクセス制限ディレクトリをiモード端末でアクセスすると?

webサーバ上に.htaccessでアクセス制限をかけた、
"A"というフォルダがあり、その下位に"A1","A2","A3"
という3つのフォルダにBBSのCGIを入れました。
"A"に置いた index.html から各CGIを選ぶ運用です。

PCやau端末では、"A"の中のHTMLを表示する前に、
ベーシック認証がかかり、"A"とサブフォルダの間を
行ったり来たりは自由にできます(当然ですね)。

ところが、iモード端末ですと行き来の度に認証がかかり、
CGIを調べても、相対パスの指定しか書いていません。

iモード端末でもPCやau端末と同じ操作にしたいので、
チェックポイントやヒントでも結構なので教えて下さい。

Aベストアンサー

iモードでは、端末によってBASIC認証の動作が違うようです。

参考URL:http://www.nttdocomo.co.jp/p_s/imode/tag/s5.html#5_4

Q${str}と$strの違いとは?

スカラー変数の${str}と$strの違いとは何なのでしょうか。

スカラー変数における{}の意味がよくわかりません。
別になくても処理は変わらない気がしますが、
どういった際に{}は使用するのでしょうか?

Aベストアンサー

もしPerlでのことでしたら、スカラー変数名を{}で囲むのは、それ以降に半角文字が続く場合に、そのスカラー変数名と半角文字の文字列との境界を明示するためだと思います。 変数自体に何かの違いがあるということではないはずです。

たとえば、処理の中でスカラー変数$strに続けてstrという文字を書き出したい場合、「$strstr」と記述すると、[$str]とは別の[$strstr]という名前のスカラー変数と認識されてしまいます。 これを避けるために、スカラー変数名を{}で囲って、「${str}str」と記述することで、$strというスカラー変数に、strという文字が続いていると認識させる、という具合だと思います。

見当違いでしたらごめんなさい。


このカテゴリの人気Q&Aランキング

おすすめ情報