Signal

ruby 1.7 特性

该模块负责执行UNIX信号的相关操作.

模块函数:

Signal.list

ruby 1.8 特性:

返回一个Hash对象,它将信号名称与信号号码一一对应起来.

p Signal.list   # => {"WINCH"=>28, "PROF"=>27, ...}
Signal.trap(signal, command)
Signal.trap(signal) { ... }

ruby 1.8 特性:

它将command注册为中断信号signal的处理程序. signal可以是信号名称字符串,Symbol或信号号码. 还可以使用诸如0或"EXIT"这样的特殊值. 它表示"程序结束时".

command可以是字符串或块. 若将其指定为nil、空字符串"""SIG_IGN"或者"IGNORE"的话, 则会尽可能地忽略信号. 若指定为"SIG_DFL"或者"DEFAULT"时, 将使用默认的信号处理程序. 若指定为"EXIT"时, 在收到信号后将会进行结束时的相关处理, 然后以状态值0来结束程序.

若遇到若干个信号时, Ruby解释器会引发InterruptSignalException异常. 另外,还可以使用异常处理部分来捕捉这些信号.

begin
  Process.kill :QUIT, $$   # 向自己发送SIGQUIT
rescue SignalException
  puts "rescue #$!"
end
# => rescue SIGQUIT

由trap捕捉到的信号不会引发异常.

trap会返回上一次trap所设定的处理程序. 若使用了块的话, 将把它转化为Proc对象, 然后再返回这个对象. 若设置为字符串或者 "EXIT" 的话,就返回它们. 若设置为"IGNORE" 或 "DEFAULT" 的话,就返回 nil. 若没有设置任何内容时, 将返回nil.

另外, 若在ruby的框架外设置了信号处理程序时(例如, 扩展库独自调用sigaction时),也会返回nil.

p Signal.trap(:INT, "p true")     # => nil
p Signal.trap(:INT) { }           # => "p true"
p Signal.trap(:INT, "SIG_IGN")    # => #<Proc:0x401b1328>
p Signal.trap(:INT, "DEFAULT")    # => nil
p Signal.trap(:INT, "EXIT")       # => nil
p Signal.trap(:INT, nil)          # => "EXIT"

若将系统中尚未定义的信号指定给 trap 时, 会引发 ArgumentError异常. 例如, 在本地Windows系统(mswin32, mingw 等)上的ruby环境中, 则只定义了INT ILL FPE SEGV TERM BREAK ABRT EXIT.