From: Tanaka Akira Date: 2004-08-20T11:42:43+09:00 Subject: [ruby-dev:24137] warning: read buffer data lost 次のように、read buffer data lost という警告がソケットで出ます。 % ./ruby -rsocket -v -e ' sock1, sock2 = UNIXSocket.pair sock2 << "aaaaaaazbbbbbbbbbbbb\n" io = sock1 p io.gets("z") io.puts "y" p io.gets ' ruby 1.9.0 (2004-08-19) [i686-linux] "aaaaaaaz" -e:6: warning: read buffer data lost -e:6: warning: read buffer data lost "bbbbbbbbbbbb\n" ソケットでは読み込みバッファと書き込みバッファが分かれていてデータは失 われないため、この警告は不適切ではないでしょうか。 さて、では f2 がない時だけに警告をすればいいのかというと、そうもいきま せん。例えば、次のケースがあります。 % echo aaaaaaazbbbbbbbbbbbb > tst % ./ruby -rsocket -v -e ' io = open("tst", "r+") p io.gets("z") io.puts "y" p io.gets ' ruby 1.9.0 (2004-08-19) [i686-linux] "aaaaaaaz" -e:4: warning: read buffer data lost "bbbbbbbbbb\n" % cat tst aaaaaaazy bbbbbbbbbb このケースでは f2 はありませんが、問題なく動いています。これは、読み込 みバッファの内容を捨てるときに捨てた長さだけ seek でファイルオフセット を戻しているからです。 逆にいえば、問題が起こるのは seek できないソケット (やパイプや端末や様々 なデバイス) です。したがって、適切に警告を出すには、seek 出来るかどう かを判定する必要があります。 しかし、もしその判定が可能なら、seek 出来ないときには最初から読み込み バッファと書き込みバッファを分けておけば適切に動作できてしまいます。と いうわけで、いずれにしろ警告は不適切ではないでしょうか。 -- [田中 哲][たなか あきら][Tanaka Akira]