了解信号处理程序如何附加到进程
Understanding how signal handlers attach to a process
我正在尝试了解信号处理程序如何附加到进程及其进程范围。
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
现在,如果我在执行 give_output
且 @@static_object
不为零时向进程发出 SIGUSR1
,则处理程序应按预期运行。然而,即使在 give_output
完成执行后,如果发送信号,Process2
中的处理程序将捕获它。据我了解,处理程序附加到流程中。我们可以为同一个信号的同一个进程设置两个信号处理程序吗?例如 - 当 give_output
正在执行并发出信号时,Process2
中的处理程序应该获得控制权,否则 Main
中定义的另一个信号处理程序应该获得控制权。
我自己对此很好奇,发现了以下资源:http://timuruski.net/blog/2014/signals-traps-and-rescues/, https://www.ruby-forum.com/topic/87221, and http://www.ibm.com/developerworks/library/l-reent/。第二个 link 有一些资源似乎与您的问题非常相关。
简而言之,每个进程只能可靠地捕获一种中断类型。信号中断由主机处理OS。顾名思义,中断会停止程序的正常执行,直到中断被处理。
总结@Anthony E 发布的链接中提供的信息。使用信号陷阱不可能从代码中的多个位置捕获信号。如果您想在多个地方以不同方式处理信号,请使用救援块。
信号陷阱 -
Signal.trap("USR1") do
#do something
end
救援中断 -
begin
#some functions
rescue Interrupt
#handle the exception
exit
end
rescue和trap处理信号的方式不同-
Trap在代码的开头定义了handler,如果有信号被触发,就会被trap捕获。另一方面,rescue 定义在代码的底部,即当没有可用的陷阱时,它会引发一个 Signal Exception,该异常将被 rescue 块捕获
信号陷阱代码与进程相关联,无法替换。如果想在程序的不同地方以不同的方式处理信号,最好的方法是引发异常并处理它
我正在尝试了解信号处理程序如何附加到进程及其进程范围。
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
现在,如果我在执行 give_output
且 @@static_object
不为零时向进程发出 SIGUSR1
,则处理程序应按预期运行。然而,即使在 give_output
完成执行后,如果发送信号,Process2
中的处理程序将捕获它。据我了解,处理程序附加到流程中。我们可以为同一个信号的同一个进程设置两个信号处理程序吗?例如 - 当 give_output
正在执行并发出信号时,Process2
中的处理程序应该获得控制权,否则 Main
中定义的另一个信号处理程序应该获得控制权。
我自己对此很好奇,发现了以下资源:http://timuruski.net/blog/2014/signals-traps-and-rescues/, https://www.ruby-forum.com/topic/87221, and http://www.ibm.com/developerworks/library/l-reent/。第二个 link 有一些资源似乎与您的问题非常相关。
简而言之,每个进程只能可靠地捕获一种中断类型。信号中断由主机处理OS。顾名思义,中断会停止程序的正常执行,直到中断被处理。
总结@Anthony E 发布的链接中提供的信息。使用信号陷阱不可能从代码中的多个位置捕获信号。如果您想在多个地方以不同方式处理信号,请使用救援块。
信号陷阱 -
Signal.trap("USR1") do
#do something
end
救援中断 -
begin
#some functions
rescue Interrupt
#handle the exception
exit
end
rescue和trap处理信号的方式不同-
Trap在代码的开头定义了handler,如果有信号被触发,就会被trap捕获。另一方面,rescue 定义在代码的底部,即当没有可用的陷阱时,它会引发一个 Signal Exception,该异常将被 rescue 块捕获
信号陷阱代码与进程相关联,无法替换。如果想在程序的不同地方以不同的方式处理信号,最好的方法是引发异常并处理它