平田といいます.

Socket::for_fdで生成したSocketのインスタンスをcloseすると,
for_fdに渡した,元のIOが読めなくなってしまいます.

例えば,以下のようなスクリプトを実行して,
telnetで繋いで見るとgetsのところでEBADFになってしまいます.

require 'socket'

lsock = TCPServer.open( 1100 );
loop do
  sock = lsock.accept();
  peer = Socket::for_fd( sock.fileno() );
  peer.close();
  sock.gets();
  sock.close();
end

straceで調べてみると,上のスクリプトで言うと,peer.closeのところで,
for_fdからdupで生成されたfdと元の(for_fdに渡した)fdの両方をcloseしてい
るようです.これはこういうものなのでしょうか?
何か,根本的な勘違いをしているような気もしますが.

環境はruby 1.6.6 (2001-12-26) [i686-linux]です.

--------------------------------------------------------------------------
平田直人
PGP Fingerprint =
333F F590 D859 43D8 A3DA  8DF1 7836 5645 8536 6CF3
hirata-naoto / sannet.ne.jp
http://www.page.sannet.ne.jp/hirata-naoto/index.html