system
への呼び出しを使用して作成された子プロセスでルビプロセスを中断すると、ルビプロセス自体が中断されません。彼らは同じグループに属している必要がありますので、両方を中断する必要があります。これはruby2.0では無効です。ルビー1.8.7パッチ371、ルビー1.9.3パッチ392とruby2.0パッチ0を考えるとルビから呼び出された割り込みの子孫
:
bashでruby1.8 -e 'system "sleep 100"; p $?; sleep'
を実行して^Cを押すとsleep 100
にのみ、内部呼び出しを殺します。
Ruby 1.9は同じように動作します。
ruby2.0 -e 'system "sleep 100"; p $?; sleep'
割り込み内部コマンドとルビープロセスitself.2.0.0-P0のソースを読む
--EDIT--
の両方を実行しているけど、私は取り扱いSIGINT
、SIGQUIT
とSIGHUP
があることを見つけましたrb_syswait
メソッドで無視されました。これは、作成されたサブプロセスが終了するのを待ってからハンドラを復元します(rb_syswait
:ruby v1.8.7-p370、ruby v1.9.3-p362、ブロッキングハンドラはruby v2.0.0-p0にありません)。
なぜsystem
とIO.popen
の場合のみ、%x{}
またはfork{}
ではないのですか?
実装の詳細またはこれを回避する方法を知りたいですか? –
@SemyonPerepelitsa:both +通常の動作とみなされるべきもの – tig
@SemyonPerepelitsaはなぜそれが行われたのか、最良の回避策ですか – tig