From: Tanaka Akira Date: 2010-02-27T01:43:30+09:00 Subject: [ruby-dev:40508] Re: [Bug:trunk] IO behaviors on mingw 2010年2月27日1:13 Yusuke ENDOH : > 以下のように、IO に関して Linux と mingw で挙動が違います。 > それぞれ仕様でしょうか、バグでしょうか。 あまり Windows に詳しくはないのですが、 http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=Windows+%A4%CE+IO に Windows で注意しないといけないことをいくらか書いてあります。 私はテスト環境を持っていないので以下の記述は単なる推測であり、 確実な話ではないと考えて読んでください。 > 1) $ ./ruby -e 'f = File.open("foo", "w"); IO.for_fd(f.fileno, "r")' > linux: EINVAL > mingw: 何も言わない (gets したら EBADF) > 参考: http://redmine.ruby-lang.org/issues/show/1582 F_GETFL がないので無理なんじゃないでしょうか。 > 2) $ ./ruby -e 'f1 = File.open("foo", "w"); f2 = IO.new(f1.fileno); p f2.gets' > linux: IOError > mingw: EBADF F_GETFL がないので事前に調べるのは無理なんじゃないでしょうか。 > 3) $ rm foo && touch foo && ./ruby -e 'f = File.open("foo"); p f.eof?; > p f.getc; f.ungetc(100); p f.eof?; p f.getc' > linux: true, nil, false, "d" > mingw: true, nil, true, "d" cbuf ですかねぇ。 これは eof? が false を返すようにできる気もします。 ただ、単純にここだけ直すと cbuf が空でなくて eof? が偽のときに バイト列な読み込みメソッドがブロックするような気がするなぁ。 やはりそっちは例外ですかね。 > 4) $ echo foo > foo && ./ruby -e 'f = File.open("foo"); f.getc; p > f.pos; f.ungetc(100); p f.pos' > linux: 1, 0 > mingw: 1, 1 cbuf ですかねぇ。 cbuf に入っているデータはバイト列としてもともと 何バイトあったのか不明で補正できないので。 > 5) $ ./ruby -e 'File.open("foo", "w") {|f| > f.write_nonblock("012345678901234567890123456789") }' > linux: 普通に書き込まれる > mingw: EBADF Windows の non-blocking I/O は socket 専用なんじゃないでしょうか。 -- [田中 哲][たなか あきら][Tanaka Akira]