signals/what_answers_a_signal.rb
tests/_examples/signals/what_answers_a_signal.rb in the metorex repository.
# `Signal.trap` says what answers a signal. It takes anything that answers to
# `call` when the signal arrives, hands back what it read there before, and
# refuses the signals a program has no say over.
Signal.trap(:HUP, "IGNORE")
answers = Object.new
def answers.call(number)
puts("answered #{number == Signal.list['HUP']}")
end
p(Signal.trap(:HUP, answers))
Process.kill(:HUP, Process.pid)
# A signal nothing was ever written for is the operating system's to answer.
p(Signal.trap("PROF", "DEFAULT"))
# The name may be written long or short, as a Symbol or a String, or as the
# number the operating system knows it by.
p(Signal.trap(:SIGHUP, "DEFAULT").equal?(answers))
p(Signal.trap(Signal.list["HUP"], "DEFAULT"))
# What the interpreter keeps for itself is refused, and so is a number or a
# value that names no signal at all.
begin
Signal.trap("SEGV", -> {})
rescue ArgumentError => refused
p(refused.message)
end
begin
Signal.trap(300) { }
rescue ArgumentError => refused
p(refused.message)
end
begin
Signal.trap(nil) { }
rescue ArgumentError => refused
p(refused.message)
end
# `EXIT` names what to run as the program ends, ahead of what `at_exit` left.
at_exit { puts("at_exit") }
Signal.trap(:EXIT, proc { puts("on the way out") })
Output:
"IGNORE"
answered true
"SYSTEM_DEFAULT"
true
"DEFAULT"
"can't trap reserved signal: SIGSEGV"
"invalid signal number (300)"
"bad signal type NilClass"
on the way out
at_exit