Bug #7951

Cannot rescue SignalException in 1.9.3 or 2.0.0

Added by James Harton about 1 year ago. Updated about 1 year ago.

[ruby-core:52864]
Status:Closed
Priority:Normal
Assignee:-
Category:-
Target version:2.0.0
ruby -v:ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.1] Backport:

Description

When running the example provided on http://www.ruby-doc.org/core-1.9.3/SignalException.html we find that neither Ruby 1.9.3p392 nor Ruby 2.0.0p0 are able to rescue SignalException:

$ cat <signalexceptiontest.rb
puts "#{RUBYVERSION}p#{RUBYPATCHLEVEL}"
begin
Process.kill('HUP',Process.pid)
rescue SignalException => e
puts "received Exception #{e}"
end
EOF

$ rvm 1.8.7,1.9.3,2.0.0 do ruby signalexceptiontest.rb
1.8.7p371
received Exception SIGHUP
1.9.3p392
/Users/jnh/.rvm/scripts/set: line 20: 99759 Hangup: 1 "${args[@]}"
2.0.0p0
/Users/jnh/.rvm/scripts/set: line 20: 99816 Hangup: 1 "${args[@]}"

Associated revisions

Revision 39501
Added by Motohiro KOSAKI about 1 year ago

  • error.c: clarify a document of SignalException. Process.kill() doesn't have any guarantee when signal will be delivered. [Bug #7951]

Revision 39819
Added by Motohiro KOSAKI about 1 year ago

  • internal.h: added a declaration of ruby_kill().
  • thread.c (ruby_kill): helper function of kill().

  • signal.c (rbfkill): use ruby_kill() instead of kill().

  • signal.c (rbfkill): call rbthreadexecute_interrupts()
    to ensure that make SignalException if sent a signal
    to myself. [Bug #7951]

  • vmcore.h (typedef struct rbthreadstruct): added
    th->interrupt
    cond.

  • thread.c (rbthreadptrinterruptcommon): added to
    initialization of th->interrupt
    cond.

  • thread.c (threadcreatecore): ditto.

  • test/ruby/testsignal.rb (TestSignal#testhup_me): test for
    the above.

History

#1 Updated by Motohiro KOSAKI about 1 year ago

Following modified script works fine. That is a issue of YARV signal handling.

puts "#{RUBYVERSION}p#{RUBYPATCHLEVEL}"
begin
Process.kill('HUP',Process.pid)
sleep 0.1
rescue SignalException => e
puts "received Exception #{e}"
end

#2 Updated by Motohiro KOSAKI about 1 year ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r39501.
James, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • error.c: clarify a document of SignalException. Process.kill() doesn't have any guarantee when signal will be delivered. [Bug #7951]

#3 Updated by Motohiro KOSAKI about 1 year ago

I changed a doc because the example has a mistake of usage of Process.kill(). Process.kill() doesn't have any guarantee when signal will be delivered.

Also available in: Atom PDF