From: KOSAKI Motohiro Date: 2011-06-25T09:31:10+09:00 Subject: [ruby-dev:43896] Re: [Ruby 1.9 - Bug #4072] dRubyで作成したサーバプログラムがsleepしていてもexitしてしまう > 遠藤です。 > > 2011年6月24日14:43 KOSAKI Motohiro : >> ところで、話は変わるのですが thread.stopも process.sleep の「thread.run するまで >> スリープする」と書いて有るのにシグナル受信したときの挙動が違うのはなぜなんでしょうね? >> deadlock check作った遠藤さんに聞くべきなのかも知れませんが。 > > > 文脈を全く理解してないんですが、Thread.stop が deadlock 検出して Kernel# > sleep がしないのはなぜか、という話? > > Thread.stop は別スレッドから Thread#run されるのを待つもの (なので他の > スレッドも止まったらデッドロック) 、Kernel#sleep は別プロセスから Ctrl-C > などでシグナルを受けるのを待つもの (なので他のスレッドが生きてようと死んで > ようとデッドロックではない) 、という用途の違いを意識してそうしました。 > [ruby-dev:35330] の前後にそんな感じの話題がちょっとだけあります。 > > 全然違う話だったら無視してください。 返信が遅くてすいません。遠藤さんとぐぐる先生のご尽力によりこのへんの仕様は だいぶクリアーになりました。 現状不明確なのは sigpipe のようなインタプリタ内部で握りつぶしているシグナルや trap(:INT) { } のような Rubyレベルで握りつぶしている場合もwakeupしてくるが これは仕様か。という点だけだと思います。 なんとなく、例外だけにしたほうがいい気がするんですよ。Unixシグナルが存在しない Windows とか JRubyが困るんじゃないかと