[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/10 00:43 / Filesize : 262 KB / Number-of Response : 974
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:nobodyさん [02/06/23 10:18 ID:eY2l+Gw1]
どんな環境でも使えて、軽くて、頑丈なロックを考えようじゃありません

654 名前:nobodyさん mailto:sage [04/03/31 12:43 ID:???]
chmod() でっていうのは具体的にどうやるの?

655 名前:nobodyさん mailto:sage [04/03/31 12:54 ID:???]
>>654
chmodがどういうものかわからないの?

656 名前:nobodyさん mailto:sage [04/03/31 13:50 ID:???]
時々書き込みしてもインデックスの数字が増えないことがあるが
ロックに失敗してると考えると納得できる話だな > 2chがchmodでロック


657 名前:nobodyさん mailto:sage [04/03/31 15:11 ID:???]
>>655
あなたはわかっているの?

658 名前:nobodyさん mailto:sage [04/03/31 18:13 ID:???]
運用情報のbbs.cgi再開発スレにチラッと載ってる。

659 名前:nobodyさん mailto:sage [04/03/31 21:42 ID:???]
>>658
1000ストップを確実にする方法の議論に見えました。

660 名前:nobodyさん mailto:sage [04/03/31 23:37 ID:???]
なんかflockを使いたくない議論してるよね。

どうせアトミックじゃないのなら
1000の書き込み後にchmodして
1001はクライアントで描画
dat落ち時にはdatに1001を書く、
とか適当にやれば1030くらいで止まるんじゃない?

ダサいけど。


661 名前:nobodyさん mailto:sage [04/04/10 18:40 ID:???]
余分な処理を追加して確実にするより1から書き直したほうがいいんじゃないかな。
運用の奴ら全員で1台のディスプレイを囲んで。
オンラインでの議論なんて無駄無駄。

662 名前:nobodyさん mailto:sage [04/04/16 01:00 ID:???]
filerock



663 名前:nobodyさん mailto:sage [04/04/19 09:45 ID:???]
ロック状態の情報をロックファイルの中に書いておこうと思ったら、
ロックファイルをファイルロックしなければならなくなった。orz

664 名前:nobodyさん mailto:sage [04/04/21 07:50 ID:???]
ロックファイルをファイルロックした情報をロックファイルに書くことはしないんでしょう。

665 名前:nobodyさん mailto:sage [04/04/21 12:24 ID:???]
ロックファイルは存在が全てです。
よくある流行歌の「君がいるだけで」というフレーズが言い当てています。

666 名前:nobodyさん mailto:sage [04/04/23 14:39 ID:???]
たとえばーきみがいるだーけでこころがーろっくされるーことー

667 名前:nobodyさん mailto:sage [04/04/26 01:30 ID:???]
renameするロックはうまく書けば完璧かなと思ったが、外からの干渉に弱い気がする。

668 名前:nobodyさん mailto:sage [04/04/26 01:31 ID:???]
干渉とは?

669 名前:nobodyさん mailto:sage [04/04/27 11:45 ID:???]
>>668
1分でレスしてきた君のためにGTO神書き換えのレスで返そうかと思ったけど、難しいのでやめた。
例えば、/path/to/dataというパスのファイルをファイルロック中は/path/to/data.lockとするぷろぐらみゅがあるとして、
その横で
while(1) {
 open(F, '>/path/to/data');
 close(F);
 open(F, '>/path/to/data.lock');
 close(F);
}
なんてことされたらたまんねぇと。
まあ、適切にパーミッションを設定すれば問題ないのだが、
私はファイルは0666、ディレクトリは0777でも問題ないことを信条としてるのであれかなと。

670 名前:nobodyさん mailto:sage [04/04/27 13:29 ID:???]
>>669
それは、前提が間違ってると思う。
「みなさん、ロックのためのリソースの○○はこうこうこういうふうに使いましょう」
っていう規約をみんながきちんと守ってる、っていう前提で設計しないと。
そんなこと言ったら、「ハカーが○○してきたら」とか「電源落されたら」とか
「スーパーユーザに○○されたら」とか考え出したら何もできないと思う。

671 名前:nobodyさん mailto:sage [04/04/27 13:54 ID:???]
>>670
ハァ?お前は K E N T か?
アップローダーを例に取るとサーバーとユーザーの設定次第で
pc5.2ch.net/test/read.cgi/hp/1076940865/888n
のような事も起こってしまうわけで。
専用のサーバーを使うなら>>670のような設計で構わないと思うけど、
こっちは共用向け、大量配布だからな。そういうわけにはいかんのよ。

672 名前:nobodyさん mailto:sage [04/04/27 14:22 ID:???]
>>671
「 K E N T 」というのは何だか知らないけど、そういうことなら納得です。

# でも >>667 のようなレスからそんな事情は推し測れないよ。



673 名前:nobodyさん mailto:sage [04/04/27 17:59 ID:???]
んー、でもやっぱ正しく安全に使える人が正しく安全に使える鯖で使って下さいで良い気がするんだけど。

初回起動時にランダムな文字列のディレクトリ名やファイル名をスクリプトが自分自身の中に保存して、
それを使い rename()(または mkdir() や open() で作成)してそれをベースとするとか。
ディレクトリ内の一覧表示とかに弱いし総当りもあるし完璧では無いけど。


674 名前:nobodyさん mailto:sage [04/04/27 18:00 ID:???]
と思ったが666なら外からスクリプト自体すら書き換え可能になるのか。
なんてこったい。


675 名前:nobodyさん mailto:sage [04/04/27 20:43 ID:???]
書き替えられるならやってみろ。外からな。

676 名前:nobodyさん mailto:sage [04/04/28 01:00 ID:???]
書き換えられないんなら良いんじゃない。


677 名前:nobodyさん mailto:sage [04/04/28 01:04 ID:???]
>>675
あんたのサイトの書き込み可能は無敵でうらやましいよ

678 名前:nobodyさん mailto:sage [04/04/28 01:51 ID:???]
結局ロックファイルとは直接関係ない話ね。

679 名前:nobodyさん mailto:sage [04/04/28 02:52 ID:???]
みんなさあ、自分の想定する環境とか前提条件とかを明確にしてから
話を始めるようにしようよ。
でないと議論にならないし不毛すぎるよ。

>>667 みたいな話の切り出し方は最低。

680 名前:nobodyさん mailto:sage [04/04/28 16:51 ID:???]
何だ何だ?renameをファイルロックに使ってる魚ばかり網にかかってるじゃないか。

681 名前:nobodyさん mailto:sage [04/04/28 17:14 ID:???]
みんなとほほに操られてるのね

682 名前:nobodyさん mailto:sage [04/04/30 17:27 ID:???]
という事で、bindでロックをかけようとしたが、Windows(Me)上ではいくらでもbind出来てしまうので意味無し。
そんな物を使うぐらいならソケットでプロセス間通信をしてしまう方が楽であると思うが、
Perlなんかでそんな事したらパフォーマンスが(以下略



683 名前:nobodyさん mailto:sage [04/05/19 04:13 ID:???]
すいません。PERLのCGIでtxtファイルを読みこむんですが、読みこみだけの場合でも排他制御は必要でしょうか?

誰かがファイルオープンしているときに別プロセスからファイルを読みこもうとした場合openエラーになっちゃいますよね。
それが嫌な場合は

open(DATA,"< test.txt");
flock(DATA,1);
なんたらかんたら
close(DATA);

みたいにして一人がオープンしている間は別プロセスには待たせればよろしいんでしょうか?
flockの説明を見てみると読みこみだけの時用の番号がなかったので、不安です。自分のPCはwin98なのでflockは使えませんし、
鯖にぶつけ本番はいやだなと思って聞きにきました。


684 名前:nobodyさん mailto:sage [04/05/19 04:50 ID:???]
>>683
みんな読むだけだったら別に排他制御は全然要らんよ。

685 名前:nobodyさん mailto:sage [04/05/19 07:03 ID:???]
683氏に似た質問です。

書き込みの処理が2つ以上同時に行われないと分かっている場合
かつ、一過性の読み込み失敗を許容する場合
書き込みにロックは不要ですか?

686 名前:nobodyさん [04/05/19 09:38 ID:4B5lUTgr]
Dirty readを許すのか、許さないのか?
話はそれからだ


687 名前:nobodyさん mailto:sage [04/05/19 11:10 ID:???]
>>685
「ロックとは何のために必要なのかを教えてくれ」という質問と等価と考えてよいのかな

688 名前:683 mailto:sage [04/05/19 17:00 ID:???]
>>684
いらないんですか。ということはアクセス集中によるオープンエラーは読みこみだけならば
起こらないということですか?

本当は自分でその状況を作り出してテストしてみたいんですけど、動作テストはwin98に入れたhttpdなので
同時アクセスが試せないんですよね。

ファイルオープンするCGIがユーザに色んな項目を記入してもらった次のページなのでエラーが
でちゃうとまた、入力してもらう事になってしまうのでそれはまずいなと思いまして;

689 名前:nobodyさん mailto:sage [04/05/19 18:15 ID:???]
>誰かがファイルオープンしているときに別プロセスからファイルを読みこもうとした場合openエラーになっちゃいますよね。

これがそもそも勘違いだしな。

690 名前:nobodyさん mailto:sage [04/05/19 19:43 ID:???]
>>688
Windows はどうだか知らんけど、
UNIX なら読み出すだけならアクセス集中でオープンエラーなんてないだろ。

つーか、そこまで信頼性高いシステムが必要なら、2ちゃんなんかで質問するより、
もっとちゃんと調べて勉強するか、外注に出した方が良いんじゃないか?

691 名前:683 mailto:sage [04/05/19 23:00 ID:???]
>>689
ありがとうございます。
吐いた制御ってオープンエラーを防ぐんじゃなくて、書きこみが同時に行われてファイルが壊れるのを
防ぐためにあるってことですね。

>>690
ありがとうございました。

692 名前:685 mailto:sage [04/05/20 15:35 ID:???]
>685です。レスが遅れてすみません。
返答ありがとうございます。

>>686
Dirty readとは書き込み中に読み込めるということで、最新でないものを読み込めてしまうということでしょうか。
それは構いませんし、リロードで直る一時的なものであれば読み取りが0バイトでも構いません。

>>687
そういう事になるかも知れません。
言い換えると
書き込み処理が重複しない時、理論的にファイルが壊れるか否かが知りたいのです。



693 名前:nobodyさん mailto:sage [04/05/20 20:28 ID:???]
ファイルを壊す原因は山ほどあるが、
その中でも「書き込み処理が重複する」という原因はよく起こる。
この重複を避けるための道具が、ファイルロック。

ロックは、これさえかければファイルが壊れなくなるという魔法の杖ではない。
ロックは単なるプログラミングの道具に過ぎず、
それも、ファイルを壊さなくするための道具ではなく、
書き込みが重複しているかどうかを識別するだけの道具。
識別した上で書き込みが重複しないようにプログラムを書くのは、プログラマの責任。

逆に、書き込みが重複しないということが100%保証されているなら、
ロックをかけてもかけなくても変わらない。
もちろんその場合でも、書き込み処理重複以外の原因でファイルが壊れることは、いくらでも考えられる。

694 名前:nobodyさん mailto:sage [04/05/20 20:38 ID:???]
書き込みが重複しないということをロック以外の方法で100%に近い精度で
保証する方法なんてあるのか?


695 名前:nobodyさん mailto:sage [04/05/20 21:07 ID:???]
>〜するだけの道具。
まではいい事言ってると思うんだが最後の方になって壊れてるな。

696 名前:nobodyさん mailto:sage [04/05/20 22:40 ID:???]
>>694
単に、書き込みが100%重複しない論理空間を仮定すれば、というだけの話でしょ。
もちろん現実にそんなことはありえないと暗示しているわけで。

697 名前:685 mailto:sage [04/05/21 01:02 ID:???]
皆様回答ありがとうございます。

>>693
という事は書き込みが重複しないなら、
ファイルロックで防げる程度のトラブルは防げるという事ですね。

>>694
書き込み処理を行えるのがパスワードを知っている1人なのです。
パスワードが他人に漏れず、その1人が同時に操作せず、
openしたまま処理が中断することもない・・・
という仮定はありますが。

ファルイロックの基本的な知識さえない私に丁寧な回答ありがとうございました。

698 名前:nobodyさん mailto:sage [04/05/27 13:48 ID:???]
やっと最近になってきっちりしたファイルロックのコード書けるようになった。

けっこうウソ書いてあるサイトが多いのに驚いた。

699 名前:nobodyさん mailto:sage [04/05/27 17:15 ID:???]
>>698
そういうサイトもきっちり書けていると思ってんだろ。
お前と同じように。

700 名前:nobodyさん mailto:sage [04/05/27 20:14 ID:???]
きっちり書けるようになったと自分で思い込むのは勝手だが、他人には言うな。

701 名前:nobodyさん mailto:sage [04/05/27 21:10 ID:???]
どうキッチリ書いたか教えて欲しい

702 名前:nobodyさん mailto:sage [04/05/27 21:08 ID:???]
どう書いたか教えて欲しい



703 名前:nobodyさん mailto:期待上げ [04/05/28 01:38 ID:???]
うん
見せてよ

704 名前:698 mailto:sage [04/05/28 11:16 ID:???]
わたしは秘密主義なんで弟子にも教えることはない。

自分で掴み取れ!  これに尽きるな

705 名前:nobodyさん mailto:sage [04/05/28 15:29 ID:???]
ふっ。これで糞コード蔓延の芽がまた一つ摘み取られた。良かった良かった。

706 名前:nobodyさん mailto:sage [04/05/30 14:43 ID:???]
ファイルロックなんかしなくったって、めっちゃ速く処理してしまえばええやん

707 名前:nobodyさん mailto:sage [04/05/30 14:44 ID:???]
>>706

すげー!! それだっ!

708 名前:nobodyさん mailto:age [04/05/30 18:12 ID:???]
ファイルロックなんかしなくったって、誰もアクセスしなければええやん


709 名前:nobodyさん mailto:sage [04/05/30 22:14 ID:???]
windowsならmutexを使う手があるよん。名前にファイルパス(\は/に置き換えたやつ)
を使う。速いしいいぞ。


710 名前:709 mailto:sage [04/05/30 22:16 ID:???]
はっ、ここはPerlの板だった。
xs使って作るしか、、、。


711 名前:nobodyさん mailto:sage [04/05/30 22:23 ID:???]
>>709 Win32::Mutex
search.cpan.org/~gsar/libwin32-0.191/

712 名前:nobodyさん mailto:sage [04/05/31 00:08 ID:???]
おお、あるんだ。
他のOSとかもないのかな。
lock::mutexとかいう一本にまとめて使えるようなライブラリがいいなぁ。
mutexもセマフォも使えないけどflockは使えるOSだったら、
内部実装はflockでやるとか。




713 名前:357 mailto:sage [04/05/31 20:57 ID:???]
flock使えない機種でmutexを使ってflock模擬したほうがいいか。


714 名前:713 mailto:sage [04/05/31 22:53 ID:???]
うわ、名前間違えた。

715 名前:nobodyさん mailto:age [04/10/09 22:28:45 ID:???]
ダレモイナィ
タアソウスルナラ イマノウチ

716 名前:nobodyさん mailto:sage [04/10/09 23:12:22 ID:???]
open(LOCK, ">lock.tmp");
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?

717 名前:nobodyさん mailto:sage [04/10/10 04:46:13 ID:???]
萌えは初心者だから良くわからないけど、
$count=$count++;

$count++;
でいいと思うけど。

718 名前:nobodyさん mailto:sage [04/10/10 16:53:04 ID:???]
>>716
いいえNG

719 名前:716 mailto:sage [04/10/10 16:59:43 ID:???]
>>718
どこら辺がNG?

720 名前:nobodyさん mailto:sage [04/10/10 17:10:11 ID:???]
無駄なことをやってるだけだろ

open (IN, "count.dat");
flock(IN,2);
$count=<IN>;
$count++;
print IN $count;
close(IN);

これでいいじゃん

721 名前:716 mailto:sage [04/10/10 17:16:22 ID:???]
えっ?それじゃ書き込めないのでは?

722 名前:nobodyさん mailto:sage [04/10/10 17:19:40 ID:???]
すまん

open (IN, "+>count.dat");



723 名前:716 mailto:sage [04/10/10 17:36:23 ID:???]
カウンタだとそれでいいけど、掲示板など複数のファイルを弄る場合にはロック用のファイルが必要になるよね?

724 名前:nobodyさん mailto:sage [04/10/10 17:43:35 ID:???]
>>723
そんなのは一概には言えない。
各ファイルは読み込み・書き込み・両方のいずれなのか、
一度に連続して読み書きするのかなど。

725 名前:nobodyさん [04/10/20 14:16:48 ID:ejI/DpjA]
aaa

726 名前:nobodyさん [04/10/21 19:09:46 ID:wxBAgdgR]
perl,phpの両スクリプトから書き込みがあるファイルがあるんだが、
mkdirとかにしといた方が無難かね?
それぞれでflock()したって排他かからない?

727 名前:nobodyさん mailto:sage [04/10/21 19:24:18 ID:???]
実装言語がどれでも中では flock(2) を呼ぶわけだし flock() で問題ないんじゃない?

728 名前:nobodyさん mailto:sage [04/10/21 23:27:35 ID:???]
>>727
デマ飛ばすな。ボケッ

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.

729 名前:nobodyさん [04/10/22 01:27:00 ID:W+TTmfbF]
>>727
なるほど、結局perl,phpのflock()が同じシステムコールを使うかどうかって所ですかね?
linux(redhat)なんですが、普通にflock(2)使ってると思って良いのかなぁ。

730 名前:nobodyさん mailto: [04/10/22 17:20:32 ID:???]
通常、perlのflock()もphpのflock()も、下位レベルで使ってるシステムコールはflock(2)なわけだが。

731 名前:nobodyさん mailto:sage [04/10/23 01:59:39 ID:???]
言語, OS, ファイルシステム等の実装に依存
php4.3.9/linux はソース確認したところ flock(2) 使ってないよ。fcntl(2)。

732 名前:nobodyさん mailto:sage [04/10/23 02:53:34 ID:???]
perl5.8/linuxはflock(2)だっけ?fcntl(2)だったっけ?



733 名前:nobodyさん mailto:sage [04/10/23 04:34:45 ID:???]
ごめん、phpでもflock(2)使ってた. -->731は間違い
双方とも flock(2) が使える環境では flock が使われる.

また間違ってるかも知れないので、調べたソースを書いておく。
php-4.3.9 ./ext/standard/flock_compat.c
perl-5.8.5 ./pp_sys.c


734 名前:nobodyさん mailto:sage [04/10/23 13:22:56 ID:???]
おお、すばらしい。
flock(2)使える環境って前提になるが(BSD,SystemV,Linux?)、PerlでもPHPでもflock()でいけるのか。
NFS上のディスクは別として。

735 名前:nobodyさん mailto:sage [04/10/25 18:24:04 ID:???]
なるほどねぇ

736 名前:nobodyさん mailto: [04/10/25 19:07:12 ID:???]
lockアゲ

737 名前:nobodyさん [04/11/06 19:49:00 ID:em3fuQlS]
 

738 名前:nobodyさん mailto:sage [04/11/06 19:58:00 ID:???]
flock最強神話

739 名前:nobodyさん mailto:sage [04/11/07 05:49:26 ID:???]
RDBMSで行ロック最強

740 名前:nobodyさん mailto:sage [04/11/07 23:08:21 ID:???]
結局、KENTのmkdirやsymlink、初心者のよく使うflock、どこかでみたrename、格付けするとどうなの?

741 名前:nobodyさん mailto:sage [04/11/08 00:05:16 ID:???]
>>740
格付けなんて意味ないのでは?適材適所でしょ。

742 名前:nobodyさん mailto:sage [04/11/08 00:10:15 ID:???]
>>740
flockを使う奴は素人だといいたいのか〜(w



743 名前:nobodyさん mailto:sage [04/11/08 00:30:26 ID:???]
>>740
KENTは素人じゃないといいたいのか〜(w

744 名前:nobodyさん [04/11/08 13:12:26 ID:BIj8xOyZ]
最終兵器ロックオン・レーザー搭載!

「一度捕まえたら、離さない・・・・・」

TAITOの名作シューティングRAY・FORCEができるのは
セガサターンだけ!

745 名前:740 mailto:sagePerl歴4ヵ月PHP歴28日 [04/11/08 21:24:24 ID:???]
いや…そういう訳じゃ…

746 名前:nobodyさん mailto:sage [04/11/08 23:46:08 ID:???]
cmpxchg最強

747 名前:nobodyさん mailto:sage [04/11/09 03:55:57 ID:???]
>>744
レイヤーセクションじゃなかったっけ?

748 名前:nobodyさん mailto:sage [04/11/09 07:25:54 ID:???]
>>740
flock>>>>>越えられない壁>>>>>rename=symlink>>mkdir

749 名前:nobodyさん mailto:sage [04/11/09 08:59:34 ID:???]
flockはNFS介して使うと壊れるから糞

750 名前:nobodyさん mailto:sage [04/11/09 13:16:33 ID:???]
激しくループしてるな。

751 名前:nobodyさん mailto:sage [04/11/09 13:43:34 ID:???]
ネタがファイルロックだけだから進展しようが無い

752 名前:nobodyさん mailto:sage [04/11/09 20:07:15 ID:???]
>>749
NFSを使った事無いので、良く分からないので教えてください。

NFSを利用する時はflock関数にflock(2)ではなくfcntl(2)を利用するように
perlをビルドすると思いますが、それでもロックは壊れるのでしょうか。
fcntl(2)で壊れる場合、実際の解決手段として、どのようなものがあるのでしょうか。



753 名前:nobodyさん mailto:sage [04/11/10 00:42:16 ID:???]
>>752
Maildir

754 名前:nobodyさん mailto:sage [04/11/10 01:28:10 ID:???]
>>753
djb 厨ってホントにいつも頭使わずに発言するなあ。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<262KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef