トップページ⇒php
981コメント337KB

【Perl】ファイルロック(排他処理)について語ろう

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん02/06/23 10:18ID:eY2l+Gw1
どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません
0930nobodyさん2006/11/28(火) 17:08:23ID:???
その前にとりあえずご飯を
0931nobodyさん2006/11/28(火) 19:23:59ID:???
その前に妹を紹介して
0932nobodyさん2006/11/29(水) 00:11:52ID:???
>>924
ロックには二種類しかない、駄目なロックと正しいロックだ。中間はない。
「ロックの強度」などと言うやつが作ったものは駄目なロックである可能性が非常に高い。
0933nobodyさん2006/11/29(水) 03:37:00ID:???
男は黙ってライブステージに立てロックを感じろ
0934nobodyさん2007/01/29(月) 15:46:57ID:MdfhpFZP
今夜ネットつながるのでファイルロックを研究するためこのスレ使いますね。PHPですけど。
0935nobodyさん2007/01/29(月) 17:47:33ID:???
ずんずんちゃっずんずんちゃっ
うぃ〜うぃるうぃ〜うぃるろっきゅ〜
0936nobodyさん2007/01/29(月) 18:21:17ID:???
それ lock じゃなくて rock
0937nobodyさん2007/01/29(月) 18:45:24ID:???
ファイルロックはデータファイル以外にロック用ファイルを用意したほうが楽だから
そうしてるけどデータファイル自体をロックする場合って
一時ファイルに書き出してデータファイル名にリネームした瞬間ロック解除扱いになるんだよね?

そうなるとロック待ちプロセスがデータファイルオープンしてファイルロック中にリネーム
されたらファイルが存在しなくなってファイルハンドルが無効になってファイルロックが偽を返すのかな?
0938nobodyさん2007/01/29(月) 19:04:35ID:???
とりあえずコードで説明して
0939nobodyさん2007/01/30(火) 10:08:22ID:???
>>937
> 一時ファイルに書き出してデータファイル名にリネーム
それ自体は何ら排他処理になっていない。書込途中のプロセス死亡と
いったケースでデータファイルが壊れるのを防ぐ為の手順。

ロックファイルを使わずに排他処理したいなら、

open my $fh, '+<', '/path/to/file' or die $!;
flock $fh, LOCK_EX;
...
close $fh;

のようになる。
0940nobodyさん2007/04/16(月) 16:21:56ID:wXXA2dJL
このスレも残りわずかですね

1つ疑問いいですか?
flockの有効範囲(?)っていうのがいまいち分からなくて。。
同一サーバ内、バーチャルドメインごと、1スクリプトごと。。。??

flockを使って、このスレにある方法を使い正しいロック方法の時だとします

ここまで読んだものから推測するとサーバ内であれば別のスクリプトから呼び出しても効きますよね?(ファイルハンドルが同じなら)

逆に言えばflockを使っているファイルハンドルを別のスクリプトで使ったら解除してしまうってことですか?
レン鯖みたいな共用鯖でよく使いそうなファイルハンドル(INとかOUTとか)でflockを使うと危険なんですかね?


0941nobodyさん2007/04/16(月) 16:38:48ID:???
言語に備わってるファイルロック関数は信用してはいけない
0942nobodyさん2007/04/16(月) 18:29:01ID:???
>>940
Perlのflockは様々な実装があるので、ここではUnix互換OSのflock(2)が
使われた場合とすると、

・flockはOSの機能なので、機能するのはOSの範囲内。
・正しい書き方をすれば、別のプロセスがロックを外すことは無い。
・別プロセスからのflockの開放は可能らしい。
0943nobodyさん2007/04/16(月) 18:31:45ID:???
ファイル構造体にフラグ立ててるわけだからファイルハンドル・別スクリプト云々は考えなくていいっしょ
0944nobodyさん2007/04/16(月) 19:58:57ID:???
mkdirが使えるなら絶対そっちのほうがいいよ
0945nobodyさん2007/04/23(月) 18:26:23ID:???
>942
遅ればせながら�です
0946nobodyさん2007/04/23(月) 20:20:20ID:???
NFSを介した向こう側のファイルを開く時はflockが効かなかったりする。
0947nobodyさん2007/04/26(木) 17:01:49ID:???
>>946
(OSが管理してるので)同じサーバ内でならflockでいい。
別のサーバからのアクセスもロックしたいなら
lockd動かしてfcntlでロックする。
0948nobodyさん2007/04/29(日) 20:50:11ID:QRYQeqJ7
ファイルロックって、馬鹿ですか?
mutex使えよ、アホ
0949nobodyさん2007/04/30(月) 00:26:57ID:???
>>948
Windowsなんて糞なサーバ使うより1000万倍まし。
0950nobodyさん2007/04/30(月) 14:00:30ID:???
>>946
そういうときは、fcntlを使うようにオプションで指示してコンパイルする。
0951nobodyさん2007/04/30(月) 14:26:51ID:???
ファイルロック関数に頼ったロックに頼るべきではない。
独自に考えるべき
0952nobodyさん2007/04/30(月) 17:20:06ID:???
ここはスレタイにあるとおり、「perl」でという制約の元の排他制御に
関する議論をするスレッドなんだよ。
しかもwebprog板なので、サーバーサイド限定だ。
すなわちWin限定の解は採点が低い。
0953nobodyさん2007/04/30(月) 18:09:45ID:???
次スレは言語選ばないべき。過疎ってるから
0954nobodyさん2007/04/30(月) 18:34:21ID:???
PHPも仲間に入れてやってください
0955nobodyさん2007/04/30(月) 22:19:01ID:???
PHPか。
0956nobodyさん2007/05/01(火) 08:41:54ID:???
Perlで1個作って、それを移植するだけだろw
0957nobodyさん2007/05/01(火) 11:06:12ID:???
>>956
ほとんど同じでOKなの?
0958nobodyさん2007/05/03(木) 07:37:55ID:???
5年前のスレかよw
0959nobodyさん2007/11/12(月) 23:00:45ID:???
半年前のレスかよ
0960nobodyさん2007/11/25(日) 15:43:12ID:YhRNGWJK
ageてみるか
0961nobodyさん2008/03/14(金) 20:29:09ID:???
このスレが無限ロックされてるんじゃね?w
0962nobodyさん2008/08/08(金) 02:57:43ID:???
flockにロックIDとかつけてくんないかなー
部分ロックしたいときに困る
0963nobodyさん2008/08/08(金) 02:59:41ID:V81X7ey0
ていうかファイルに対するlockじゃなくて、完全にIDのみで管理するロック機構があれば応用がきくのに
そういうのって何で作られないの?何かわけがあるの?
0964nobodyさん2008/08/08(金) 10:06:25ID:???
ファイルに対してlockしないでなににlockするんだい?

管理はファイルごとに行うんじゃなくてファイルハンドルごとに行うんじゃないかい?
ま、ルールに則って処理しなければlockはいくらでも無視できるけど
0965nobodyさん2008/08/08(金) 19:52:28ID:???
何言ってんのさ。
mkdirとかを用いた方法だって、あくまで"処理のロック"だろ。
その処理ってのがファイルアクセスだったときにファイルロックになるだけでさ。

わざわざロック専用のファイル作ってそれにflockかける場合のこと考えると、「対象としてのファイルがなければロックできない」ってのはどうにも無駄な制限だと思うんだけど。


って書いたけどIDだけでの管理は共用鯖とかだと現実的じゃないな。
0966nobodyさん2008/08/08(金) 20:28:34ID:???
System V IPCのセマフォ使えばいいんじゃない?
perlなら組み込み関数あるし、CPANにもライブラリあるよ。
0967nobodyさん2009/09/07(月) 18:18:57ID:0FwHnD5n
質問です。
apacheのアクセスログの様にとにかく最後尾に追記するだけの場合、排他処理は必要ですか?

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
>>968
レスありがとうございます。
後で編集するので書き込まれる順序は特に気にしませんが
一応flock程度はやっておこうかなと思ってます。
0970nobodyさん2009/09/13(日) 16:22:21ID:YylJyw/3
それは print を使うからでは。
一回のシステムコールで書き込まれるようにすれば?
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を超えると書き込みができなくなります。