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 厨ってホントにいつも頭使わずに発言するなあ。