From: Yusuke Endoh Date: 2009-01-04T00:57:25+09:00 Subject: [ruby-dev:37685] [Bug #968] trap may fail to handle signals チケット #968 が更新されました。 (by Yusuke Endoh) 遠藤です。 補足です。 シグナルが連続して送られたとき、その回数だけシグナルハンドラが呼ばれる という保障は OS レベルで存在しないと聞きました。 ただ今の Ruby は、せっかくシグナルハンドラが呼ばれた場合でも trap を 呼び損ねる場合があります。 また、種類が異なるシグナルでも trap を呼び損ねる場合があるのですが、 Unix ではこれすら保障されないのでしょうか。 $ ./ruby -e ' n = 0 trap(:USR1) { n += 1 } trap(:USR2) { n += 1 } pid = $$ fork do sleep 0.5 p "send start" Process.kill(:USR1, pid) Process.kill(:USR2, pid) p "send end" end p "calc start" 1000**100000 # wait p "calc end" p n ' "calc start" "send start" "send end" "calc end" 1 現在 test-all の TestSignal#test_exit_action が結構な確率で失敗しますが、 これも同じ問題のようで、前述のパッチを当てると通るようになります。 私の環境で高確率で 0F0E になるので、うれしいです (Rinda のテストが 稀に失敗しますが) 。 というわけで、積極的な反対がなければとりあえずコミットしてしまおう と思います。 -- Yusuke ENDOH ---------------------------------------- http://redmine.ruby-lang.org/issues/show/968 ---------------------------------------- http://redmine.ruby-lang.org