[ruby-list:46579] Re: IO#flock

From: Takahiro Kambe <taca@...>
Date: 2009-11-30 14:45:07 UTC
List: ruby-list #46579
In message <4B13CD86.8050701@moji.gr.jp>
	on Mon, 30 Nov 2009 22:49:59 +0900,
	"5.5" <5.5@moji.gr.jp> wrote:
> lock1.rb を走らせた直後に lock2.rb を走らせれば,以下のように
> 動作する,と期待して実験しました。
> 
> [1] まず lock1.rb が 1 を書こうとする。flush はしてないので,
>  バッファーに書かれるのみ。
そもそもバッファリングに動作を依存するのはどうかと思いますが、

> [2] lock1.rb は 5 秒間のスリープに入る。
> [3] lock2.rb が 3 を書こうとするが,ロックされているので,書
>  けない。待機する。
RubyのIO#flockは、UNIX系OSのflock(2)へのインターフェイスですが、
flock(2)にはwrite(2)を防ぐといったロックを提供しているわけでは
ありません。互いにflock(2)を使ってロックの有無を確認できるだけ
のロック(advisory lock)です。

後から作られたfcntl(2)ベースのシステムコールでは、write(2)に
影響を与えるmandatory lockを提供している場合もありますが、flock
という名前から一般的に期待できる動作はadvisory lockだけです。

従って、この時点で想定されている動作ではありません。

-- lock2.rb --
open("log.txt", "a+") do |f|
  f.flock File::LOCK_EX
  f.puts 3
end
------

と、でもすれば期待される動作となるでしょう。

-- 
神戸 隆博 / Takahiro Kambe 


In This Thread