【Perl】ファイルロック(排他処理)について語ろう
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
02/06/23 10:18ID:eY2l+Gw10930nobodyさん
2006/11/28(火) 17:08:23ID:???0931nobodyさん
2006/11/28(火) 19:23:59ID:???0932nobodyさん
2006/11/29(水) 00:11:52ID:???ロックには二種類しかない、駄目なロックと正しいロックだ。中間はない。
「ロックの強度」などと言うやつが作ったものは駄目なロックである可能性が非常に高い。
0933nobodyさん
2006/11/29(水) 03:37:00ID:???0934nobodyさん
2007/01/29(月) 15:46:57ID:MdfhpFZP0935nobodyさん
2007/01/29(月) 17:47:33ID:???うぃ〜うぃるうぃ〜うぃるろっきゅ〜
0936nobodyさん
2007/01/29(月) 18:21:17ID:???0937nobodyさん
2007/01/29(月) 18:45:24ID:???そうしてるけどデータファイル自体をロックする場合って
一時ファイルに書き出してデータファイル名にリネームした瞬間ロック解除扱いになるんだよね?
そうなるとロック待ちプロセスがデータファイルオープンしてファイルロック中にリネーム
されたらファイルが存在しなくなってファイルハンドルが無効になってファイルロックが偽を返すのかな?
0938nobodyさん
2007/01/29(月) 19:04:35ID:???0939nobodyさん
2007/01/30(火) 10:08:22ID:???> 一時ファイルに書き出してデータファイル名にリネーム
それ自体は何ら排他処理になっていない。書込途中のプロセス死亡と
いったケースでデータファイルが壊れるのを防ぐ為の手順。
ロックファイルを使わずに排他処理したいなら、
open my $fh, '+<', '/path/to/file' or die $!;
flock $fh, LOCK_EX;
...
close $fh;
のようになる。
0940nobodyさん
2007/04/16(月) 16:21:56ID:wXXA2dJL1つ疑問いいですか?
flockの有効範囲(?)っていうのがいまいち分からなくて。。
同一サーバ内、バーチャルドメインごと、1スクリプトごと。。。??
flockを使って、このスレにある方法を使い正しいロック方法の時だとします
ここまで読んだものから推測するとサーバ内であれば別のスクリプトから呼び出しても効きますよね?(ファイルハンドルが同じなら)
逆に言えばflockを使っているファイルハンドルを別のスクリプトで使ったら解除してしまうってことですか?
レン鯖みたいな共用鯖でよく使いそうなファイルハンドル(INとかOUTとか)でflockを使うと危険なんですかね?
0941nobodyさん
2007/04/16(月) 16:38:48ID:???0942nobodyさん
2007/04/16(月) 18:29:01ID:???Perlのflockは様々な実装があるので、ここではUnix互換OSのflock(2)が
使われた場合とすると、
・flockはOSの機能なので、機能するのはOSの範囲内。
・正しい書き方をすれば、別のプロセスがロックを外すことは無い。
・別プロセスからのflockの開放は可能らしい。
0943nobodyさん
2007/04/16(月) 18:31:45ID:???0944nobodyさん
2007/04/16(月) 19:58:57ID:???0945nobodyさん
2007/04/23(月) 18:26:23ID:???遅ればせながら�です
0946nobodyさん
2007/04/23(月) 20:20:20ID:???0947nobodyさん
2007/04/26(木) 17:01:49ID:???(OSが管理してるので)同じサーバ内でならflockでいい。
別のサーバからのアクセスもロックしたいなら
lockd動かしてfcntlでロックする。
0948nobodyさん
2007/04/29(日) 20:50:11ID:QRYQeqJ7mutex使えよ、アホ
0951nobodyさん
2007/04/30(月) 14:26:51ID:???独自に考えるべき
0952nobodyさん
2007/04/30(月) 17:20:06ID:???関する議論をするスレッドなんだよ。
しかもwebprog板なので、サーバーサイド限定だ。
すなわちWin限定の解は採点が低い。
0953nobodyさん
2007/04/30(月) 18:09:45ID:???0954nobodyさん
2007/04/30(月) 18:34:21ID:???0955nobodyさん
2007/04/30(月) 22:19:01ID:???0956nobodyさん
2007/05/01(火) 08:41:54ID:???0958nobodyさん
2007/05/03(木) 07:37:55ID:???0959nobodyさん
2007/11/12(月) 23:00:45ID:???0960nobodyさん
2007/11/25(日) 15:43:12ID:YhRNGWJK0961nobodyさん
2008/03/14(金) 20:29:09ID:???0962nobodyさん
2008/08/08(金) 02:57:43ID:???部分ロックしたいときに困る
0963nobodyさん
2008/08/08(金) 02:59:41ID:V81X7ey0そういうのって何で作られないの?何かわけがあるの?
0964nobodyさん
2008/08/08(金) 10:06:25ID:???管理はファイルごとに行うんじゃなくてファイルハンドルごとに行うんじゃないかい?
ま、ルールに則って処理しなければlockはいくらでも無視できるけど
0965nobodyさん
2008/08/08(金) 19:52:28ID:???mkdirとかを用いた方法だって、あくまで"処理のロック"だろ。
その処理ってのがファイルアクセスだったときにファイルロックになるだけでさ。
わざわざロック専用のファイル作ってそれにflockかける場合のこと考えると、「対象としてのファイルがなければロックできない」ってのはどうにも無駄な制限だと思うんだけど。
って書いたけどIDだけでの管理は共用鯖とかだと現実的じゃないな。
0966nobodyさん
2008/08/08(金) 20:28:34ID:???perlなら組み込み関数あるし、CPANにもライブラリあるよ。
0967nobodyさん
2009/09/07(月) 18:18:57ID:0FwHnD5napacheのアクセスログの様にとにかく最後尾に追記するだけの場合、排他処理は必要ですか?
use Fcntl;
sysopen(OUT, $FileName, O_WRONLY|O_CREAT|O_APPEND);
print OUT "aaa\n";
close(OUT);
これだけで済めばいいな〜というのは甘い考えでしょうか?
0968nobodyさん
2009/09/09(水) 17:11:40ID:???0969nobodyさん
2009/09/09(水) 17:27:59ID:jdeXznBzレスありがとうございます。
後で編集するので書き込まれる順序は特に気にしませんが
一応flock程度はやっておこうかなと思ってます。
0970nobodyさん
2009/09/13(日) 16:22:21ID:YylJyw/3一回のシステムコールで書き込まれるようにすれば?
syswrite を使うか、バッファを無効にする。
0971nobodyさん
2009/10/08(木) 14:28:23ID:???ロックは必須でしょう?
0972nobodyさん
2009/10/12(月) 23:17:19ID:???http://www.bioinfo.jp/tips.html#append に詳しく書いてある。
確認してみれ。
0973nobodyさん
2009/10/19(月) 19:57:43ID:???0974nobodyさん
2010/12/07(火) 00:32:09ID:???0975nobodyさん
2010/12/07(火) 00:36:21ID:???0976nobodyさん
2010/12/07(火) 00:42:44ID:???0977nobodyさん
2010/12/07(火) 00:48:12ID:???0978nobodyさん
2010/12/07(火) 00:52:46ID:???0979nobodyさん
2010/12/07(火) 01:02:14ID:???0980nobodyさん
2010/12/07(火) 01:08:46ID:???0981nobodyさん
2010/12/07(火) 01:14:46ID:???レス数が950を超えています。1000を超えると書き込みができなくなります。