次のように、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]