From: KOSAKI Motohiro Date: 2011-06-21T10:23:12+09:00 Subject: [ruby-dev:43858] Re: [ruby-dev:43856] Re: [ruby-dev:43855] Re: [Ruby 1.9 - Bug #4909][Open] trapハンドラは再入されてはいけないのではないか? >  ささだです. > > (2011/06/21 1:25), Masaya TARUI wrote: >> 同意します。 >> というか、いままでmaskされてないと知らなかった。 > >  mask するための新しい仕様が必要になると思いますが,さてこれを 1.9.3 に > 入れますか? それとも,trap 中はどんな trap を再入禁止? 1.9.3には入れるべきではないと思います。基本的に今仕様の議論をしているものは 全部1.9.4送りという認識。(なので、targetを 1.9.x にセットした) # redmineに起票するのを一月遅らせるべきでした。すいません maskの選択肢は以下の2つだと認識です 1)あるtrapを処理中はあらゆるtrapが発生しない 2)あるtrapを処理中は、同一シグナルはtrapされないが別シグナルは トラップする(ネストされうる) ※C言語と同じ 要求仕様を整理すると A)スタックオーバーフローしない B)trapの再入は通常のスクリプトユーザの手に余るのでなるべく起こしたくない C)SIGUSR1等のtrapで無限ループしてても、Ctrl-Cで終了して欲しい という事かと思います。 Aは(1)(2)どちらでもみたされます。(2)でもシグナルの数が 有限なので。 問題は(B)と(C)があまり両立しない関係にあることです。おそらくナイーブな プログラムはSignal-AのtrapハンドラにSignal-Bのトラップがネストしてきても 誤動作するでしょう。また、このようなタイミング問題はマニュアルに注意を書いた ところでなくなりません。 しかし Ctrl-C で終了しない可能性を増やすのはたぶん苦情がきます。 よって以下の仕様を提案します。 ・trapハンドラ実行中はいかなるtrapも発生しない(trapハンドラ終了まで遅延される) ・ただしtrapハンドラ未登録時のデフォルト動作(Interrupt例外発生)は、trapハンドラ 実行中も禁止されない 穴があるかもしれないので、叩いてください。 よろしくお願いいたします。