【Perl】ファイルロック(排他処理)について語ろう
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/06/23 10:18ID:eY2l+Gw10682nobodyさん
04/04/30 17:27ID:???そんな物を使うぐらいならソケットでプロセス間通信をしてしまう方が楽であると思うが、
Perlなんかでそんな事したらパフォーマンスが(以下略
0683nobodyさん
04/05/19 04:13ID:???誰かがファイルオープンしているときに別プロセスからファイルを読みこもうとした場合openエラーになっちゃいますよね。
それが嫌な場合は
open(DATA,"< test.txt");
flock(DATA,1);
なんたらかんたら
close(DATA);
みたいにして一人がオープンしている間は別プロセスには待たせればよろしいんでしょうか?
flockの説明を見てみると読みこみだけの時用の番号がなかったので、不安です。自分のPCはwin98なのでflockは使えませんし、
鯖にぶつけ本番はいやだなと思って聞きにきました。
0685nobodyさん
04/05/19 07:03ID:???書き込みの処理が2つ以上同時に行われないと分かっている場合
かつ、一過性の読み込み失敗を許容する場合
書き込みにロックは不要ですか?
0686nobodyさん
04/05/19 09:38ID:4B5lUTgr話はそれからだ
0688683
04/05/19 17:00ID:???いらないんですか。ということはアクセス集中によるオープンエラーは読みこみだけならば
起こらないということですか?
本当は自分でその状況を作り出してテストしてみたいんですけど、動作テストはwin98に入れたhttpdなので
同時アクセスが試せないんですよね。
ファイルオープンするCGIがユーザに色んな項目を記入してもらった次のページなのでエラーが
でちゃうとまた、入力してもらう事になってしまうのでそれはまずいなと思いまして;
0689nobodyさん
04/05/19 18:15ID:???これがそもそも勘違いだしな。
0690nobodyさん
04/05/19 19:43ID:???Windows はどうだか知らんけど、
UNIX なら読み出すだけならアクセス集中でオープンエラーなんてないだろ。
つーか、そこまで信頼性高いシステムが必要なら、2ちゃんなんかで質問するより、
もっとちゃんと調べて勉強するか、外注に出した方が良いんじゃないか?
0691683
04/05/19 23:00ID:???ありがとうございます。
吐いた制御ってオープンエラーを防ぐんじゃなくて、書きこみが同時に行われてファイルが壊れるのを
防ぐためにあるってことですね。
>>690
ありがとうございました。
0692685
04/05/20 15:35ID:???返答ありがとうございます。
>>686
Dirty readとは書き込み中に読み込めるということで、最新でないものを読み込めてしまうということでしょうか。
それは構いませんし、リロードで直る一時的なものであれば読み取りが0バイトでも構いません。
>>687
そういう事になるかも知れません。
言い換えると
書き込み処理が重複しない時、理論的にファイルが壊れるか否かが知りたいのです。
0693nobodyさん
04/05/20 20:28ID:???その中でも「書き込み処理が重複する」という原因はよく起こる。
この重複を避けるための道具が、ファイルロック。
ロックは、これさえかければファイルが壊れなくなるという魔法の杖ではない。
ロックは単なるプログラミングの道具に過ぎず、
それも、ファイルを壊さなくするための道具ではなく、
書き込みが重複しているかどうかを識別するだけの道具。
識別した上で書き込みが重複しないようにプログラムを書くのは、プログラマの責任。
逆に、書き込みが重複しないということが100%保証されているなら、
ロックをかけてもかけなくても変わらない。
もちろんその場合でも、書き込み処理重複以外の原因でファイルが壊れることは、いくらでも考えられる。
0694nobodyさん
04/05/20 20:38ID:???保証する方法なんてあるのか?
0695nobodyさん
04/05/20 21:07ID:???まではいい事言ってると思うんだが最後の方になって壊れてるな。
0696nobodyさん
04/05/20 22:40ID:???単に、書き込みが100%重複しない論理空間を仮定すれば、というだけの話でしょ。
もちろん現実にそんなことはありえないと暗示しているわけで。
0697685
04/05/21 01:02ID:???>>693
という事は書き込みが重複しないなら、
ファイルロックで防げる程度のトラブルは防げるという事ですね。
>>694
書き込み処理を行えるのがパスワードを知っている1人なのです。
パスワードが他人に漏れず、その1人が同時に操作せず、
openしたまま処理が中断することもない・・・
という仮定はありますが。
ファルイロックの基本的な知識さえない私に丁寧な回答ありがとうございました。
0698nobodyさん
04/05/27 13:48ID:???けっこうウソ書いてあるサイトが多いのに驚いた。
0700nobodyさん
04/05/27 20:14ID:???0701nobodyさん
04/05/27 21:10ID:???0702nobodyさん
04/05/27 21:08ID:???0703nobodyさん
04/05/28 01:38ID:???見せてよ
0704698
04/05/28 11:16ID:???自分で掴み取れ! これに尽きるな
0705nobodyさん
04/05/28 15:29ID:???0706nobodyさん
04/05/30 14:43ID:???0708nobodyさん
04/05/30 18:12ID:???0709nobodyさん
04/05/30 22:14ID:???を使う。速いしいいぞ。
0710709
04/05/30 22:16ID:???xs使って作るしか、、、。
0711nobodyさん
04/05/30 22:23ID:???http://search.cpan.org/~gsar/libwin32-0.191/
0712nobodyさん
04/05/31 00:08ID:???他のOSとかもないのかな。
lock::mutexとかいう一本にまとめて使えるようなライブラリがいいなぁ。
mutexもセマフォも使えないけどflockは使えるOSだったら、
内部実装はflockでやるとか。
0713357
04/05/31 20:57ID:???0714713
04/05/31 22:53ID:???0715nobodyさん
04/10/09 22:28:45ID:???タアソウスルナラ イマノウチ
0716nobodyさん
04/10/09 23:12:22ID:???flock(LOCK,2);
open (IN, "count.dat");
$count=<IN>;
close(IN);
$count=$count++;
open (OUT, ">count.tmp");
print OUT $count;
close(OUT);
rename("count.tmp","count.dat");
unlink("lock.tmp");
flock(LOCK,8);
close(LOCK);
これでOK?
0717nobodyさん
04/10/10 04:46:13ID:???$count=$count++;
は
$count++;
でいいと思うけど。
0720nobodyさん
04/10/10 17:10:11ID:???open (IN, "count.dat");
flock(IN,2);
$count=<IN>;
$count++;
print IN $count;
close(IN);
これでいいじゃん
0721716
04/10/10 17:16:22ID:???0722nobodyさん
04/10/10 17:19:40ID:???open (IN, "+>count.dat");
0723716
04/10/10 17:36:23ID:???0724nobodyさん
04/10/10 17:43:35ID:???そんなのは一概には言えない。
各ファイルは読み込み・書き込み・両方のいずれなのか、
一度に連続して読み書きするのかなど。
0725nobodyさん
04/10/20 14:16:48ID:ejI/DpjA0726nobodyさん
04/10/21 19:09:46ID:wxBAgdgRmkdirとかにしといた方が無難かね?
それぞれでflock()したって排他かからない?
0727nobodyさん
04/10/21 19:24:18ID:???0728nobodyさん
04/10/21 23:27:35ID:???デマ飛ばすな。ボケッ
man perlfunc
flock FILEHANDLE,OPERATION
Calls flock(2), or an emulation of it, on FILEHANDLE.Returns true for success,
false on failure. Produces a fatal error if used on a machine that doesn't implement
flock(2), fcntl(2) locking, or lockf(3). flock is Perl's portable file locking interface,
although it locks only entire files, not records.
0729nobodyさん
04/10/22 01:27:00ID:W+TTmfbFなるほど、結局perl,phpのflock()が同じシステムコールを使うかどうかって所ですかね?
linux(redhat)なんですが、普通にflock(2)使ってると思って良いのかなぁ。
0730nobodyさん
04/10/22 17:20:32ID:???0731nobodyさん
04/10/23 01:59:39ID:???php4.3.9/linux はソース確認したところ flock(2) 使ってないよ。fcntl(2)。
0732nobodyさん
04/10/23 02:53:34ID:???0733nobodyさん
04/10/23 04:34:45ID:???双方とも flock(2) が使える環境では flock が使われる.
また間違ってるかも知れないので、調べたソースを書いておく。
php-4.3.9 ./ext/standard/flock_compat.c
perl-5.8.5 ./pp_sys.c
0734nobodyさん
04/10/23 13:22:56ID:???flock(2)使える環境って前提になるが(BSD,SystemV,Linux?)、PerlでもPHPでもflock()でいけるのか。
NFS上のディスクは別として。
0735nobodyさん
04/10/25 18:24:04ID:???0736nobodyさん
04/10/25 19:07:12ID:???0737nobodyさん
04/11/06 19:49:00ID:em3fuQlS0738nobodyさん
04/11/06 19:58:00ID:???0739nobodyさん
04/11/07 05:49:26ID:???0740nobodyさん
04/11/07 23:08:21ID:???0744nobodyさん
04/11/08 13:12:26ID:BIj8xOyZ「一度捕まえたら、離さない・・・・・」
TAITOの名作シューティングRAY・FORCEができるのは
セガサターンだけ!
0745740
04/11/08 21:24:24ID:???0746nobodyさん
04/11/08 23:46:08ID:???0749nobodyさん
04/11/09 08:59:34ID:???0750nobodyさん
04/11/09 13:16:33ID:???0751nobodyさん
04/11/09 13:43:34ID:???0752nobodyさん
04/11/09 20:07:15ID:???NFSを使った事無いので、良く分からないので教えてください。
NFSを利用する時はflock関数にflock(2)ではなくfcntl(2)を利用するように
perlをビルドすると思いますが、それでもロックは壊れるのでしょうか。
fcntl(2)で壊れる場合、実際の解決手段として、どのようなものがあるのでしょうか。
0755nobodyさん
04/11/10 21:25:46ID:???それは、ロック機構が無くても信頼できるメールボックスの話だと思うのですが、
一般的なファイルアクセスにも使えるのでしょうか。
0756nobodyさん
04/11/12 07:07:11ID:djvAfFkIレイフォース >>>> 越えられない壁 >>>> レイヤーセクション
0757752
04/11/13 13:06:05ID:???・NFS Version4なら、ロック機構が組み込まれているので問題が無い(flock(2)でok?)
・NLM(Network Lock Manager)プロトコルに対応したサーバとクライアントならば、
fcntl(2)で対応可能。(ただし、一部のシステムで信頼が無いかも)
・それ以外はロックファイルを作るのが一般的
という感じらしいことが分かりました。
ありがとうございました。
0758nobodyさん
04/11/13 15:51:42ID:6imth/Ieレイストーム >>> レイフォース >>> レイクライシス
0759nobodyさん
04/11/14 12:08:06ID:???0760nobodyさん
04/11/15 01:32:31ID:???0761nobodyさん
04/11/18 09:27:07ID:upfr9/eiそれなに?
0762nobodyさん
04/11/18 10:10:24ID:3NzX+MnA懐かしい
0763nobodyさん
04/11/18 19:52:46ID:GLzLqJbZ0764nobodyさん
04/11/18 20:49:35ID:???0765nobodyさん
04/11/27 15:36:14ID:o5xdYnQz0766nobodyさん
04/11/27 15:54:59ID:???0769nobodyさん
04/12/04 19:37:01ID:???0770nobodyさん
04/12/20 07:41:20ID:???壊れてる可能性のあるところってバッティングしているときのだけでしょ?
0771nobodyさん
04/12/20 14:13:21ID:sskqg6P0現在1つのスクリプト中に複数の箇所でファイルロックを使ってます。
これらのファイルロックを全てやめて代わりに、
スクリプトの一番最初でダミーのファイルにロックをかけて
スクリプトの一番最後でロックを解除するようにして他のプロセスが
スクリプトを実行しているときはスクリプトの実行自体を順番待ちさせて
同時に複数のプロセスがファイルへの書き込みをできないように
変えようと思いますが、何か問題あるでしょうか?
1つ気になるのは、もしスクリプトの途中でexit関数等でスクリプトの実行が終了した場合は
自動的にダミーファイルのロックが解除されファイルも自動的にcloseされますか?
0773nobodyさん
04/12/20 15:30:20ID:???プロセスが死ねばロックは解除される。
先頭と末尾でロックと解除をするようにするのはいいが、
パフォーマンス低下は明らか。
0774nobodyさん
04/12/20 16:09:04ID:???スクリプトの実行が終了してもプロセスは死なないと思うけど
mod_* がスクリプト中の flock の後始末を面倒見てくれるんですよね?
0775nobodyさん
04/12/20 20:09:18ID:???二つ以上のプロセスが同時に追記したら、データが混じる可能性があるし。
>>772
勧告ロックはそうはいかない。
>>774
PHPは面倒みてくれるけど、mod_perlのファイルハンドルは無理。
だから、IO::File,FileHandleモジュールなどを使う。
http://perl.apache.org/docs/1.0/guide/porting.html#Filehandlers_and_locks_leakages
0776770
04/12/20 21:19:18ID:???ロックしなくて読んでいいのは、追記モードのときだけではないの?
上書きモードだと一旦中身が空になるわけで、そのときロックしないで
読んでしまったらだめだよね?
読み込んで、それをそのまま出力しておしまいな 2ch の read.cgi
みたいなやつならそういうアプローチもいいだろうけど、読んだデータ
を処理に利用する場合はだめと思う。
>>775
>>770 のやつ 「書込時にちゃんとロックする前提で」っていうのが抜けてた。スマソ
0777771
04/12/20 21:25:49ID:sskqg6P0回答ありがとうございます。
やっぱパフォーマンスの問題になりますか…
0780nobodyさん
04/12/20 23:16:39ID:???>>779
そだね
けちろん: 読み込みデータがハンパでもいいタイプのシステムなら
ロックは無用。読み込みデータがその後のデータに関わってくるのなら
ロック白
0781nobodyさん
04/12/20 23:47:40ID:???ロックの掛け方による
>>779
例えば固定長なら書込み途中のデータを見分けて使わない機構とかできそうな予感がするな?
>>780
そのけつろんは読みの場合限定ってことで
■ このスレッドは過去ログ倉庫に格納されています