咳といいます。 > 本質的には削除が正しいと思うんですが、ひとつ疑問があります。 > > 実は手元にかなり確実に Errno::EADDRINUSE が起きる環境があります。 > http://www.rubyist.net/~akr/ab/netbsd-2.0/ruby-trunk/ > > しかし、その環境では > > % ruby -rsocket -e '100.times { TCPServer.new(8473).close }' > > というのは問題なく終了するのです。 > もちろん、8473 が他で使われていない場合ですが。 > > つまり、閉じてすぐ作るぶんには問題ないわけで、本当は閉じていないのが問 > 題なんではないかと疑っています。 > > 調べてみると、 > > class TestDRbReusePort < TestDRbAry > def setup > sleep 1.2 > @ext = DRbService.ext_service('ut_port.rb') > @there = @ext.front > end > end > > というところの sleep 1.2 を消すと、手元の Debian でも確実に EADDRINUSE > になります。 > > そこで確認したいのですが、ここはソケットを閉じた後に次のテストを行う仕 > 掛けになっているんでしょうか? > > sleep のところをみると、なっていない気がするのですが。 ソケットを閉じるのは子プロセスの方なのですが、「死んでよ」とRMIでお願いして 死んでもらってます。子プロセスは「死んでよ」の返事を書いてから死ななくては ならないので、返事を書く寸前にスレッド生成して1秒後に自殺をはじめます。 それで、子プロセスが終了しきる前に同じポート番号で新しいプロセスを起動して しまうとこのような現象になります。 ですからsleepを止めると確実に起こせるのだと思います。