From: Tanaka Akira Date: 2008-12-11T17:07:56+09:00 Subject: [ruby-dev:37382] Re: [Bug #688] test_exit_action(TestSignal)でTimeout::Error In article <490675c14107f_96877bf65e10bb@redmine.ruby-lang.org>, Kazuhiro NISHIYAMA writes: > Bug #688: test_exit_action(TestSignal)でTimeout::Error > http://redmine.ruby-lang.org/issues/show/688 > > 起票者: Kazuhiro NISHIYAMA > ステータス: Open, 優先度: Normal > > ruby 1.9.0 (2008-10-27 revision 19968) [powerpc-darwin9.5.0] > や > ruby 1.9.0 (2008-10-28 revision 19973) [x86_64-linux] > の環境でTimeout::Errorになります。 > > 4) Failure: > test_exit_action(TestSignal) [.../test/ruby/test_signal.rb:52]: > [ruby-dev:26128]. > Exception raised: > <#>. 調べてみたんですが、sysread 中のシグナルに反応するかどうかが スレッドの有無で変化します。 Thread.start { sleep 1000 } というスレッドがある場合、ハングする: % ./ruby -ve ' r,w = IO.pipe pid = fork { trap(:USR1, "EXIT") Thread.start { sleep 1000 } r.sysread(4096) } sleep 1 Process.kill(:USR1, pid) Process.wait(pid) ' ruby 1.9.1 (2008-12-11 revision 20617) [i686-linux] ここでハング Thread.start { sleep 1000 } というスレッドがない場合、EINTR になる: % ./ruby -ve ' r,w = IO.pipe pid = fork { trap(:USR1, "EXIT") #Thread.start { sleep 1000 } r.sysread(4096) } sleep 1 Process.kill(:USR1, pid) Process.wait(pid) ' ruby 1.9.1 (2008-12-11 revision 20617) [i686-linux] -e:6:in `sysread': Interrupted system call (Errno::EINTR) from -e:6:in `block in
' from -e:3:in `fork' from -e:3:in `
' 1.8 では静かに終了します。 ハングもしないし、例外も出ません。 Thread.start { sleep 1000 } の有無にも依存しません。 % ruby-1.8 -ve ' r,w = IO.pipe pid = fork { trap(:USR1, "EXIT") Thread.start { sleep 1000 } p r.sysread(4096) } sleep 1 Process.kill(:USR1, pid) Process.wait(pid) ' ruby 1.8.7 (2008-10-14 revision 17572) [i686-linux] -- [田中 哲][たなか あきら][Tanaka Akira]