From: Tomoyuki Chikanaga Date: 2010-11-21T00:13:29+09:00 Subject: [ruby-dev:42612] [Ruby 1.9-Bug#4072] dRubyで作成したサーバプログラムがsleepしていてもexitしてしまう チケット #4072 が更新されました。 (by Tomoyuki Chikanaga) 近永と申します。 trunk で追試してみて発生しないなーと思っていたのですが、 手元で #4027 のチケットに添付したシグナルハンドラ絡みのパッチを適用していたためでした。 パッチを巻き戻してみたところ再現しました。 ruby -v は ruby 1.9.3dev (2010-11-19 trunk 29831) [x86_64-darwin10.5.0] です。 message メソッド実行後に メインスレッドが sleep から抜けてきているようです。 必ず起きるというわけではなくて、何回かは message を呼べることもありました。 なお sleep のかわりに DRb.thread.join にすれば大丈夫でした。 ruby に -d オプションをつけて実行してみたところ、DRbMessage#send_reply で Errno::EPIPE が 発生している時に sleep から抜けているようです。 おそらく SIGPIPE のシグナルハンドラ(sigpipe) がメインスレッドで実行されてしまった時に pthread_cond_wait から戻り値=0 errno=EINTR で抜けています。 シグナルハンドラが必ずタイマースレッドで実行されるようになれば直ると思います。 しかし前述のパッチをあてた版では逆に message を実行後に SIGINT や SIGTERM で終了しなくなって しまっているのでまだ問題がありそうです。 ---------------------------------------- http://redmine.ruby-lang.org/issues/show/4072 ---------------------------------------- http://redmine.ruby-lang.org