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

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 块捕获

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