2008年7月12日

[ruby-list:45221] Mingw/cygwinでパイプが最大数以上作られたときの挙動

ワナベと申します。

Mingw 上の trunkで、test/ruby/test_io.rb の test_dup のように
パイプを最大まで作成してIOオブジェクトの dup を繰り返したとき
処理がブロックしてしまいました。
環境は WinXP SP2 に cygwin 上のmingw-runtime 3.14-1 です。

$ ./ruby -ve '

a = []
loop{a.push IO.pipe} rescue nil
loop {a.push(p a[0][0].dup)}'
ruby 1.9.0 (2008-07-11 revision 18016) [i386-mingw32]
#<IO:0xbae4c0> # ここで処理が止まる

また cygwin でどうなるか試したところ、SEGV になってしまいました。

$ ./ruby -ve '
a = []
loop{a.push IO.pipe} rescue nil
loop {a.push(p a[0][0].dup)}'
ruby 1.9.0 (2008-07-11 revision 18016) [i386-cygwin]
-e:1: [BUG] Segmentation fault
ruby 1.9.0 (2008-07-11 revision 18016) [i386-cygwin]

-- control frame ----------
c:0007 p:---- s:0018 b:0018 l:000017 d:000017 CFUNC :pipe
c:0006 p:0016 s:0015 b:0014 l:000008 d:000013 BLOCK -e:1
c:0005 p:---- s:0014 b:0014 l:000013 d:000013 FINISH :initialize
c:0004 p:---- s:0012 b:0012 l:000011 d:000011 CFUNC :loop
c:0003 p:0031 s:0009 b:0009 l:000008 d:000008 TOP -e:1
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH :private_class_method
c:0001 p:0000 s:0002 b:0002 l:000001 d:000001 TOP <dummy toplevel>:19
---------------------------
DBG> : "-e:1:in `pipe'"
DBG> : "-e:1:in `block in <main>'"
DBG> : "-e:1:in `loop'"
DBG> : "-e:1:in `<main>'"
Aborted (core dumped)

どうやらそれぞれCの dup 関数、_pipe 関数でブロック/SEGV しているようです。
MSWin(VC2008EE)では正しく動作したので Windows の問題ではないようですし
標準関数で問題が起きているので ruby の実装の問題でもない気がします。

# 手元の環境が腐ってるだけのような気もするのですが、cygwin のインストーラに
# 従ってインストールしただけですし…

同様の現象に遭遇した方はいらっしゃらないでしょうか。
また、何が原因と考えられるでしょうか。
よろしければどなたかご助力をお願いします。

--
ワナベ


投稿者 xml-rpc : 2008年7月12日 10:08
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/75234
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。