core/signal.rb
module Signal
def self.trap(sig, prc=nil, &block)
sig = sig.to_s if sig.kind_of?(Symbol)
if sig.kind_of?(String)
osig = sig
if sig.prefix? "SIG"
sig = sig[3..-1]
end
unless number = Names[sig]
raise ArgumentError, "Unknown signal '#{osig}'"
end
else
number = sig.to_i
end
# If no command, use the block.
prc ||= block
prc = prc.to_s if prc.kind_of?(Symbol)
case prc
when "DEFAULT", "SIG_DFL"
had_old = @handlers.key?(number)
old = @handlers.delete(number)
if number != Names["EXIT"]
Rubinius.watch_signal(-number, prc.nil? || prc == 'IGNORE')
end
return "DEFAULT" unless had_old
return old ? old : nil
when "IGNORE", "SIG_IGN"
prc = "IGNORE"
when nil
prc = nil
when "EXIT"
prc = proc { exit }
when String
raise ArgumentError, "Unsupported command '#{prc}'"
else
unless prc.respond_to? :call
raise ArgumentError, "Handler must respond to #call (was #{prc.class})"
end
end
had_old = @handlers.key?(number)
old = @handlers[number]
@handlers[number] = prc
if number != Names["EXIT"]
Rubinius.watch_signal(number, prc.nil? || prc == 'IGNORE')
end
return "DEFAULT" unless had_old
return old ? old : nil
end
def self.run_handler(sig)
# Ignore nil handlers
if handler = @handlers[sig]
handler.call(sig)
end
end
def self.list
Names.dup
end
end