From: Masaya TARUI Date: 2011-06-21T01:25:05+09:00 Subject: [ruby-dev:43855] Re: [Ruby 1.9 - Bug #4909][Open] trapハンドラは再入されてはいけないのではないか? 同意します。 というか、いままでmaskされてないと知らなかった。 2011年6月20日18:46 Motohiro KOSAKI : > > Issue #4909 has been reported by Motohiro KOSAKI. > > ---------------------------------------- > Bug #4909: trapハンドラは再入されてはいけないのではないか? > http://redmine.ruby-lang.org/issues/4909 > > Author: Motohiro KOSAKI > Status: Open > Priority: Normal > Assignee: > Category: core > Target version: 1.9.x > ruby -v: ruby 1.9.3dev (2011-06-17 trunk 32146) [x86_64-darwin10.7.4] > > > 以下のプログラムは > > if intrap == 1 > raise "trap nested" > end > > が真になってしまって例外終了してしまうのですが、これは起きてはいけないのではないでしょうか。 > 以下の二点が問題だと考えます。 > > 1)このプログラムのようにシグナルを連続して配送されるとスタックオーバーフローを引き起こせる > 2)Rubyレベルでsigprocmask()に相当するシグナルブロッキング操作が提供されていないため、 > 正しいトラップハンドラを書くのが、ほぼ不可能になっている > > C言語ですら、シグナルハンドラ実行中はシグナルが自動的にマスクされるんですから、Rubyでも > 同レベルの配慮はMRIがおこなうべきだと思います。 > > --------------------------------------------------------------------- > n = 0 > intrap = 0 > > parent = $$ > > trap(:USR1) { > if intrap == 1 > raise "trap nested" > end > intrap = 1 > 10000.times { > n += 1 > } > intrap = 0 > } > > fork do > Process.kill(:USR1, parent) while true > end > > sleep 100 > ---------------------------------------------------- > > > > -- > http://redmine.ruby-lang.org > > -- 樽家昌也(Masaya TARUI) No Tool,No Life.