我试图了解信号处理程序如何附加到进程及其进程的范围。
class Main
Signal.trap('USR1') do
Process2.kill
end
def main_process
#do something
p = Process2.new
output = p.give_output
#then again do something
end
end
class Process2
Signal.trap('USR1') do
Process2.kill
end
def self.kill
if @@static_object.blank?
#do nothing
else
#do something
end
end
def give_output
#do something
@@static_object = true
#do something
end
end
现在,如果我在执行SIGUSR1
并且give_output
不是nil时向进程发出@@static_object
,则处理程序应该按预期运行。但是,即使在give_output
完成执行后,如果发送了一个信号,Process2
内的处理程序也会捕获它。据我所知,处理程序附加到进程。我们可以为同一个信号使用两个信号处理程序进行相同的处理吗?例如 - 当give_output
正在执行并发出信号时,Process2
内的处理程序应该获得控制权,否则Main
中定义的另一个信号处理程序应该得到控制权。
答案 0 :(得分:0)
我自己很好奇,并遇到了以下资源:http://timuruski.net/blog/2014/signals-traps-and-rescues/,https://www.ruby-forum.com/topic/87221和http://www.ibm.com/developerworks/library/l-reent/。第二个链接有一些与您的问题非常相关的资源。
简而言之,每个进程只能可靠地捕获一种中断类型。信号中断由主机OS处理。顾名思义,中断会暂停程序的正常执行,直到处理完中断。
答案 1 :(得分:0)
总结@Anthony E发布的链接中给出的信息。使用信号陷阱,无法从代码中的多个位置捕获信号。如果要在多个位置处理不同的信号,请使用救援块。
信号陷阱 -
Signal.trap("USR1") do
#do something
end
救援中断 -
begin
#some functions
rescue Interrupt
#handle the exception
exit
end
救援和陷阱处理信号的方式不同 -
陷阱在代码顶部定义处理程序,如果触发了信号,它将被陷阱捕获。另一方面,救援是在代码的底部定义的,也就是说,当没有可用的陷阱时,它会引发一个信号异常,它将被救援区抓住
信号陷阱代码与进程关联,无法替换。如果想要以不同的方式处理程序的不同位置的信号,最好的方法是引发异常并处理它