こんばんは。三並です。 こんな短時間でたくさんのアドバイスをありがとうございます。 いくつかへのレスをまとめました。 ディレクトリがあるかないかでの排他制御が一番わかりやすいのではと思いましたので 今回それをつかわせていただきます。 GOTO Kentaro wrote... >> lockh.flock(File::LOCK_EX) > >よく見てませんでしたが,flock で行うロックは advisory lock といって >lock したからといって書き込み等を禁ずるわけではなく,ロックしたよと >いう意志を伝えるだけのものです. > >flock でブロックしたいなら > > raise Errno::EWOULDBLOCK.new if !lockh.flock(File::LOCK_EX|File::LOCK_NB) > >のようにして,flock の結果を調べる必要があります.File::LOCK_NB とオア >をとることで flock はブロックされそうな場合 false を返しますので,上の >ように書くと例外 Errno::EWOULDBLOCK を発生します. 実はこれ知りませんでした。 排他ロックなのでてっきり他からファイルのオープンが出来なくなるものなのかと 思っていました。 IKARASHI Akira wrote... >ftp://ftp.netlab.co.jp/pub/lang/ruby/contrib/filelock.rb > >に、filelockモジュールというのがあります。 >参考になるのではないでしょうか? まだきちんとプログラムを見ていませんがさらっと見た感じ参考に なりそうでしたのできちっと解析してみたいと思います。 GOTO Kentaro wrote... >ごとけんです > >他のプロセスからファイルの一部(もしくは全部)をブロックするのでなく、外 >部のロックで対処するのであれば、ファイルよりもディレクトリの方が作る時 >点ですでに存在すればすぐにエラーが帰ってくるし手っ取り早いと思います。 >これだと lockd を使わなくても複数のHTTPサーバーで同じディスクを共有し >てる場合にも対処できます: > > LOCKDIR = 'lock' > > begin > Dir.mkdir(LOCKDIR); $LOCKING = true > > # ここで排他的な処理 > > rescue Errno::EEXIST # LOCKDIR が存在しているとき > print "already locked\n" > ensure > Dir.unlink(LOCKDIR) if $LOCKING > $LOCKING = false > end > >また、タイムアウトと排他制御は分けた方がわかりやすいような気がします。 よかったらホームページの方にごとけんさんに教えていただいたと 書きたいのですがよろしいでしょうか? これを機会にこのMLにも参加していければと思っています。 まだまだ未熟なのですがよろしくお願いします。 ___________________________ 〆 | 三並 慶佐 (Keisuke Minami) | E-mail:keisuke / rccn.com | 「do yourself better」 |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄