Управление обработкой сигналов для демонов, использующих fork()

Я хочу написать надежный демон на Perl, который будет работать в Linux, и следую шаблону, описанному в этом превосходном ответе. Однако в моей ситуации есть несколько отличий: во-первых, я использую Parallel::ForkManager start() and next; для разветвления события, за которым сразу следует exec('handle_event.pl')

В такой ситуации у меня следующие вопросы:

  1. Где я должен определить свои обработчики сигналов. Должен ли я определить их в родительском (демоне) и предположить, что они будут унаследованы в дочерних?
  2. Если я запущу exec('handle_event.pl'), будут ли обработчики наследоваться через exec (я знаю, что они наследуются через fork)?
  3. Если я переопределю новый обработчик сигнала в handle_event.pl, будет ли это определение переопределять то, что определено в родительском?
  4. Каковы наилучшие методы в такой ситуации?

Спасибо


person Ya. Perelman    schedule 22.12.2009    source источник


Ответы (2)


exec заменяет весь код процесса кодом, который будет выполняться. Поскольку обработчики сигналов являются кодом в образе процесса, они не могут быть унаследованы через exec, поэтому exec сбросит расположение обработки обработанных сигналов к их состояниям по умолчанию (игнорируемые сигналы останутся проигнорированными). Поэтому вам нужно будет установить любую обработку сигналов в процессе execed при его запуске.

person JaakkoK    schedule 22.12.2009
comment
Не все сигналы будут установлены по умолчанию, если сигнал игнорируется, он все равно будет игнорироваться после выполнения команды exec. - person gorilla; 22.12.2009
comment
@горилла: Спасибо! Ответ изменен. - person JaakkoK; 22.12.2009

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

person Jonathan Leffler    schedule 22.12.2009
comment
Спасибо - это один из тех случаев, когда я хотел бы принять более одного ответа :) - person Ya. Perelman; 22.12.2009