【Perl】ファイルロック(排他処理)について語ろう
>>924 ロックには二種類しかない、駄目なロックと正しいロックだ。中間はない。
「ロックの強度」などと言うやつが作ったものは駄目なロックである可能性が非常に高い。
男は黙ってライブステージに立てロックを感じろ
934 :
nobodyさん:2007/01/29(月) 15:46:57 ID:MdfhpFZP
今夜ネットつながるのでファイルロックを研究するためこのスレ使いますね。PHPですけど。
ずんずんちゃっずんずんちゃっ
うぃ〜うぃるうぃ〜うぃるろっきゅ〜
それ lock じゃなくて rock
ファイルロックはデータファイル以外にロック用ファイルを用意したほうが楽だから
そうしてるけどデータファイル自体をロックする場合って
一時ファイルに書き出してデータファイル名にリネームした瞬間ロック解除扱いになるんだよね?
そうなるとロック待ちプロセスがデータファイルオープンしてファイルロック中にリネーム
されたらファイルが存在しなくなってファイルハンドルが無効になってファイルロックが偽を返すのかな?
とりあえずコードで説明して
>>937 > 一時ファイルに書き出してデータファイル名にリネーム
それ自体は何ら排他処理になっていない。書込途中のプロセス死亡と
いったケースでデータファイルが壊れるのを防ぐ為の手順。
ロックファイルを使わずに排他処理したいなら、
open my $fh, '+<', '/path/to/file' or die $!;
flock $fh, LOCK_EX;
...
close $fh;
のようになる。
940 :
nobodyさん:2007/04/16(月) 16:21:56 ID:wXXA2dJL
このスレも残りわずかですね
1つ疑問いいですか?
flockの有効範囲(?)っていうのがいまいち分からなくて。。
同一サーバ内、バーチャルドメインごと、1スクリプトごと。。。??
flockを使って、このスレにある方法を使い正しいロック方法の時だとします
ここまで読んだものから推測するとサーバ内であれば別のスクリプトから呼び出しても効きますよね?(ファイルハンドルが同じなら)
逆に言えばflockを使っているファイルハンドルを別のスクリプトで使ったら解除してしまうってことですか?
レン鯖みたいな共用鯖でよく使いそうなファイルハンドル(INとかOUTとか)でflockを使うと危険なんですかね?
言語に備わってるファイルロック関数は信用してはいけない
>>940 Perlのflockは様々な実装があるので、ここではUnix互換OSのflock(2)が
使われた場合とすると、
・flockはOSの機能なので、機能するのはOSの範囲内。
・正しい書き方をすれば、別のプロセスがロックを外すことは無い。
・別プロセスからのflockの開放は可能らしい。
ファイル構造体にフラグ立ててるわけだからファイルハンドル・別スクリプト云々は考えなくていいっしょ
mkdirが使えるなら絶対そっちのほうがいいよ
>942
遅ればせながら?ォです
NFSを介した向こう側のファイルを開く時はflockが効かなかったりする。
>>946 (OSが管理してるので)同じサーバ内でならflockでいい。
別のサーバからのアクセスもロックしたいなら
lockd動かしてfcntlでロックする。
948 :
nobodyさん:2007/04/29(日) 20:50:11 ID:QRYQeqJ7
ファイルロックって、馬鹿ですか?
mutex使えよ、アホ
>>948 Windowsなんて糞なサーバ使うより1000万倍まし。
>>946 そういうときは、fcntlを使うようにオプションで指示してコンパイルする。
ファイルロック関数に頼ったロックに頼るべきではない。
独自に考えるべき
ここはスレタイにあるとおり、「perl」でという制約の元の排他制御に
関する議論をするスレッドなんだよ。
しかもwebprog板なので、サーバーサイド限定だ。
すなわちWin限定の解は採点が低い。
次スレは言語選ばないべき。過疎ってるから
PHPも仲間に入れてやってください
PHPか。
Perlで1個作って、それを移植するだけだろw
5年前のスレかよw
半年前のレスかよ
960 :
nobodyさん:2007/11/25(日) 15:43:12 ID:YhRNGWJK
ageてみるか
このスレが無限ロックされてるんじゃね?w
flockにロックIDとかつけてくんないかなー
部分ロックしたいときに困る
963 :
nobodyさん:2008/08/08(金) 02:59:41 ID:V81X7ey0
ていうかファイルに対するlockじゃなくて、完全にIDのみで管理するロック機構があれば応用がきくのに
そういうのって何で作られないの?何かわけがあるの?
ファイルに対してlockしないでなににlockするんだい?
管理はファイルごとに行うんじゃなくてファイルハンドルごとに行うんじゃないかい?
ま、ルールに則って処理しなければlockはいくらでも無視できるけど
何言ってんのさ。
mkdirとかを用いた方法だって、あくまで"処理のロック"だろ。
その処理ってのがファイルアクセスだったときにファイルロックになるだけでさ。
わざわざロック専用のファイル作ってそれにflockかける場合のこと考えると、「対象としてのファイルがなければロックできない」ってのはどうにも無駄な制限だと思うんだけど。
って書いたけどIDだけでの管理は共用鯖とかだと現実的じゃないな。
System V IPCのセマフォ使えばいいんじゃない?
perlなら組み込み関数あるし、CPANにもライブラリあるよ。
967 :
nobodyさん:2009/09/07(月) 18:18:57 ID:0FwHnD5n
質問です。
apacheのアクセスログの様にとにかく最後尾に追記するだけの場合、排他処理は必要ですか?
use Fcntl;
sysopen(OUT, $FileName, O_WRONLY|O_CREAT|O_APPEND);
print OUT "aaa\n";
close(OUT);
これだけで済めばいいな〜というのは甘い考えでしょうか?
追記は確か混じった。
969 :
nobodyさん:2009/09/09(水) 17:27:59 ID:jdeXznBz
>>968 レスありがとうございます。
後で編集するので書き込まれる順序は特に気にしませんが
一応flock程度はやっておこうかなと思ってます。
970 :
nobodyさん:2009/09/13(日) 16:22:21 ID:YylJyw/3
それは print を使うからでは。
一回のシステムコールで書き込まれるようにすれば?
syswrite を使うか、バッファを無効にする。
書き込みすんだったら、
ロックは必須でしょう?
システムに依存するけど、どの操作もアトミックにできれば、ロックはいらねぇって話だわな。