[#46502] Twitterのサンプルでエラーなんですが。 — "T.Soejima" <clev@...2.so-net.ne.jp>
そえじま@勉強中です。
9 messages
2009/11/02
[#46517] Ruby1.8.8devでのsinatra動作について — "前川 映一" <eiichi_maekawa@...>
7 messages
2009/11/05
[#46530] ARGVの引数のデータタイプ — askar <askar75@...>
アスカルです。
9 messages
2009/11/09
[#46532] Re: ARGVの引数のデータタイプ
— Yukihiro Matsumoto <matz@...>
2009/11/09
まつもと ゆきひろです
[#46535] Re: ARGVの引数のデータタイプ
— askar <askar75@...>
2009/11/11
まつもとさん、
[#46546] CSV.openがうまく動きません — ichirojiro <ichirojiro@...>
ichiroと申します。
8 messages
2009/11/14
[#46558] 【追記】 Ruby on Railsセミナーのエントリーについて — 川井健史(CO) <takeshi.kawai@...>
Rubyistの皆様
4 messages
2009/11/15
[#46571] ruby1.9 でpostgresql8.4を利用するときについて。 — Nobuyuki Inaba <nobuyuki.inaba@...>
稲葉と申します。
8 messages
2009/11/27
[#46575] Re: ruby1.9 でpostgresql8.4を利用するときについて。
— keiichi matsunaga <ma2@...>
2009/11/30
On 11/27/2009 7:12 PM, Nobuyuki Inaba wrote:
[#46572] [ANN]12/12 DevLOVE2009Fusion を開催します — <papanda0806@...>
ruby-listのみなさん
1 message
2009/11/27
[ruby-list:46578] IO#flock
From:
"5.5" <5.5@...>
Date:
2009-11-30 13:49:59 UTC
List:
ruby-list #46578
5.5 です。
IO#flock について,どうも腑に落ちない点があります。
複数のプロセスから一つのファイルにデータを追記する必要が生じた
ので,そのやり方を調べていたところ,処理系によって IO#flock の
動作が違いました。
以下の三つで実験しました。
(A) ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32]
(B) ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mswin32]
(C) ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin10]
それぞれ mswin187,mswin191,mac187 と書くことにします。
(A), (B) は Windows XP,(C) は Snow Leopard です。
以下のスクリプトを用意しました。
-- lock1.rb --
open("log.txt", "a+") do |f|
f.flock File::LOCK_EX
f.puts 1
sleep 5
f.puts 2
end
------
-- lock2.rb --
open("log.txt", "a+") do |f|
f.puts 3
end
------
lock1.rb を走らせた直後に lock2.rb を走らせれば,以下のように
動作する,と期待して実験しました。
[1] まず lock1.rb が 1 を書こうとする。flush はしてないので,
バッファーに書かれるのみ。
[2] lock1.rb は 5 秒間のスリープに入る。
[3] lock2.rb が 3 を書こうとするが,ロックされているので,書
けない。待機する。
[4] lock1.rb が 2 を書こうとする。ファイルを閉じる際に実際の
書き込みが行われる。
[5] lock1.rb によるロックが解除される。
[6] ロックが解除されたため,lock2.rb が 3 を書いてファイルを閉
じる。
その結果,log.txt には
------
1
2
3
------
と書かれるはず,と思いました。
ところが,mswin187 および mswin191 では 3 が書かれず,1, 2 だ
けが書かれました。
mac187 では,3, 1, 2 の順に書かれました。
次に,lock2.rb に 1 行追加して以下のようにし,
-- lock3.rb --
open("log.txt", "a+") do |f|
f.flock File::LOCK_EX
f.puts 3
end
------
lock1.rb → lock3.rb の順に走らせました。
すると,mswin187 では期待どおり 1, 2, 3 の順に書かれましたが,
mac187 ではいつまでたっても両方のスクリプトが終了せず,
mswin191 では 1, 2 だけが書かれて以下の例外が発生しました。
lock3.rb:2:in `flock': Invalid argument - log.txt (Errno::EINVAL)
from lock3.rb:2:in `block in <main>'
from lock3.rb:1:in `open'
from lock3.rb:1:in `<main>'
この EINVAL の意味を
http://msdn.microsoft.com/ja-jp/library/5814770t.aspx
で調べたところ,
> 不正な引数。関数の引数のいずれかに無効な値が指定されています。
> たとえば、fseek 呼び出しでファイル ポインタを移動するとき、
> 指定した元の位置がファイルの先頭より前にある場合です。
と書かれていましたが,なんだかよく分かりません。
次に,PStore ではどうなのだろうと,二つのプロセスから一つの
ファイルに PStore でデータを書こうとしたところ,mswin191 では
やはり同じ例外が発生しました。(再現コードは略します)
--
5.5@moji.gr.jp