ruby 1.7 特性
该模块负责执行UNIX信号的相关操作.
Signal.listruby 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解释器会引发Interrupt或SignalException异常. 另外,还可以使用异常处理部分来捕捉这些信号.
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.