From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1998-03-16T12:16:14+09:00 Subject: [ruby-dev:1799] Re: trap and throw problem けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :01796 ] the message: "[ruby-dev:1796] Re: trap and throw problem ", on Mar/16 11:21(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|さらに, gets()中にthrowすると, バッファの中に前回読んだ文字列が溜って >|いるらしく, 次にgets()すると前回と同じ文字が返ってきてしまいます. > >ええと,実行結果 > >|>fkslfk >|fkslfk >|>trap!! >|>fkslfk >|>fls > >の意味が良く分からなかったのですが, >|>fkslfk >|fkslfk #->^C trap!! >|>fkslfk >|>fls #->のところで, ^Cを入れると trap!!と表示されて, 前に入力した``fkslfk'' がもう一度入力される. のです... >うちでは再現してないみたいです. >matz@picachu[ruby] ruby /tmp/test.rb >>lfasfjakj >lfasfjakj >^C >>trap!! >>flsa >flsa >>flaslfja >flaslfja おかしいなああ.... OSの違いだろうか... Linux dim 2.0.30 #1 Mon Nov 10 14:08:33 JST 1997 i586 unknown ですが. >ただし,二度目からは^Cが効かないのですが,これは[ruby-dev:1790] >で報告されているものでしょう.[ruby-dev:1795]ではフラグを立 >ててどうこう,と書きましたが,そういえばrubyのシグナルの実装 >は > 基本はフラグを立てるがシステムコールやライブラリルー > チンの中では割込みがかかるように,直接呼び出す > > >のでした.これをしないと,たとえばgetsの中で^Cを押しても >enterキーを押すまでハンドラが動かなかったりして非常に使いに >くいのでした.どうしたもんだか. # これは, [ruby-list:7098] でのreadlineの問題と同じですね. それはともかく, In [ruby-dev :01795 ] the message: "[ruby-dev:1795] Re: trap and throw problem ", on Mar/16 11:12(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|trapのイテレータブロックの中でthrowを行なうと, シグナルがマスクされた >|ままになってしまっているようです. > >ふーむ,なんででしょうね.というのもシグナルハンドラではシグ >ナルのマスクを行っていないので「マスクされたまま」というのは >考えにくいのですが….sigaction(2)の仕様なんでしょうか? OSによっても違うと思いましたが, BSD系ではシグナルハンドラにはいるとマ スクがかかり, ハンドラから返るとマスクが外されるんじゃなかったでしたっ け? trap("SIGINT") { print "trap!!\n" sleep 2 # or gets() print "trap return\n" } s = nil while s != "." catch(:EXIT) do print ">" print s = gets() s.chop! end end -- 結果 dim% ruby sig2.rb >trap!! trap return trap!! trap return trap!! kk trap return kk >trap!! trap return >. 上の結果を見るとそうなっています. throwでロングジャンプするので, ハン ドラから戻る時のUNMASKが呼ばれなくなっているのでは? >となるとハンドラの中ではフラグを立てるのみでインタプリタの中 >でチェックするということになるのですが…. 実装はまかせます(^^;;; begin/ensureを使っても良いんでしょうけど. # きっと, begin/failでも同じ問題があるでしょうね. __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---