了解信号处理程序如何附加到进程

时间:2016-05-05 06:42:08

标签: ruby signals signal-handling

我试图了解信号处理程序如何附加到进程及其进程的范围。

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中定义的另一个信号处理程序应该得到控制权。

2 个答案:

答案 0 :(得分:0)

我自己很好奇,并遇到了以下资源:http://timuruski.net/blog/2014/signals-traps-and-rescues/https://www.ruby-forum.com/topic/87221http://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

救援和陷阱处理信号的方式不同 -

陷阱在代码顶部定义处理程序,如果触发了信号,它将被陷阱捕获。另一方面,救援是在代码的底部定义的,也就是说,当没有可用的陷阱时,它会引发一个信号异常,它将被救援区抓住

信号陷阱代码与进程关联,无法替换。如果想要以不同的方式处理程序的不同位置的信号,最好的方法是引发异常并处理它