From: Takahiro Kambe Date: 2001-02-20T00:52:06+09:00 Subject: [ruby-list:28067] Re: flock がエラー In message <3a913cc7.6677%vzw00011@nifty.ne.jp> on Tue, 20 Feb 2001 00:33:43 +0900, 堀川 久 wrote: >  SUSv2だと > The fildes argument is an open file descriptor. The file > descriptor must have been opened with write-only permission > (O_WRONLY) or with read/write permission (O_RDWR) to establish a > lock with this function. > となっているので,lockf()を使うと"r"で開いたファイルにLOCK_SHでロック > できません。 > >  flock()がないときはfcntl()でエミュレーションし,fcntl()がないときは lockf()はライブラリで、システムコールのfcntl()を使って実装されているも のではありませんでした? そして、上記のread onlyでオープンしたファイル 記述子に対して排他的なロックを掛けることはできなかったと記憶しています。 そう、それでディレクトリをファイルのロックに使おうとして怒ったのは、 はや10年くらい前かな。(だからSystem Vわぁ...) > ,不完全なものを提供するより,未実装エラーにする方がいいような気がして 挙動に制約ができるのは仕方ありませんが、それでもロックをファイルに頼る よりはファイル記述子によるロックができた方が100倍ましです。 移植性を考慮した場合は、 1. read onlyのファイル記述子に対するflock(ruby)が、実際はfcntl(2)ロッ クだった場合には、それがわかる例外を上げる。 2. 異なる方法によるファイルのロックを試みる。 といったコードを書くといったことが必要なのかもしれません。なお、 o 1.で書いている「それがわかる例外」が存在するかどうか、わかりません。 o Fileクラスあたりにサポートしているロックの特性を知るメソッドを用意す るというのも手かもしれません。 -- 神戸 隆博(かんべ たかひろ) at home