Понимание того, как обработчики сигналов присоединяются к процессу

Я пытаюсь понять, как обработчики сигналов присоединяются к процессу и их область действия для процесса.

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, а @@static_object не равен нулю, обработчик должен вести себя так, как ожидалось. Однако даже после того, как give_output завершит выполнение, если будет отправлен сигнал, обработчик внутри Process2 поймает его. Насколько я понимаю, обработчик привязывается к процессу. Можем ли мы иметь два обработчика сигналов для одного и того же процесса для одного и того же сигнала? Например, пока выполняется give_output и выдается сигнал, обработчик внутри Process2 должен получить управление, в противном случае другой обработчик сигнала, определенный в Main, должен получить управление.


person Community    schedule 05.05.2016    source источник


Ответы (2)


Мне самому было интересно узнать об этом, и я наткнулся на следующие ресурсы: http://timuruski.net/blog/2014/signals-traps-and-rescues/, https://www.ruby-forum.com/topic/87221 и http://www.ibm.com/developerworks/library/l-reent/. Эта вторая ссылка содержит некоторые ресурсы, которые кажутся очень важными для вашего вопроса.

Короче говоря, вы можете надежно перехватывать только один тип прерывания для каждого процесса. Сигнальные прерывания обрабатываются ОС хоста. Как следует из названия, прерывания останавливают нормальное выполнение вашей программы до тех пор, пока прерывание не будет обработано.

person Anthony E    schedule 05.05.2016
comment
Спасибо @Anthony E, ссылки были действительно полезны :). Хотя я нахожу первую ссылку более полезной, она больше похожа на то, что я пытаюсь сделать. Вторая ссылка (очень интересный вопрос!) касается обработки сигналов во время выполнения блока обработки сигналов. Я хочу иметь два обработчика сигналов для одного и того же процесса в разных местах. - person ; 05.05.2016

Обобщая информацию, приведенную в ссылках, опубликованных @Anthony E. Используя ловушку сигнала, невозможно перехватить сигнал из нескольких мест в вашем коде. Если вы хотите по-разному обрабатывать сигналы в нескольких местах, используйте блоки восстановления.

Сигнальная ловушка -

 Signal.trap("USR1") do
    #do something
 end

Спасательное прерывание -

  begin
    #some functions
  rescue Interrupt
    #handle the exception
    exit
  end

Разница в способах обработки сигналов при спасении и ловушке -

Ловушка определяет обработчик в верхней части кода, если сигнал срабатывает, он будет пойман ловушкой. С другой стороны, спасение определяется в нижней части кода, то есть, когда ловушка недоступна, она вызывает исключение сигнала, которое будет перехвачено спасательным блоком.

Код ловушки сигнала связывается с процессом и не может быть заменен. Если кто-то хочет по-разному обрабатывать сигналы в разных местах программы, лучший способ — вызвать исключение и обработать его.

person Community    schedule 10.05.2016