2009-12-22 45 views
2

我想在perl中编写一个健壮的守护进程,它将在Linux上运行,并遵循in this excellent answer描述的模板。不过,我的情况有一些差异:首先我使用Parallel::ForkManagerstart() and next;到餐桌上,紧接着exec('handle_event.pl')管理fork()的守护进程的信号处理

在这种情况下的事件,我有以下问题:

  1. 我应该在哪里定义我的信号处理程序。我应该在父进程(守护进程)中定义它们并假定它们将在子进程中被继承吗?
  2. 如果我运行exec('handle_event.pl')处理程序会通过exec继承(我知道它们是通过fork继承的)?
  3. 如果我在handle_event.pl中重新定义一个新的信号处理程序,这个定义是否会覆盖父定义的定义?
  4. 这种情况下的最佳做法是什么?

谢谢

回答

4

exec替换将要执行的代码的整个过程的代码。由于信号处理程序是过程映像中的代码,因此它们不能通过exec继承,因此exec会将已处理信号的信号处理设置重置为其默认状态(忽略的信号将保持忽略)。因此,启动时您需要在exec ed过程中安装任何信号处理。

+0

谢谢。这是非常有帮助和清晰的 –

+3

并非所有的信号都将被设置为默认值,如果信号被忽略,它将在exec后仍然被忽略。 – gorilla

+0

@gorilla:谢谢!答复修正。 – JaakkoK

5

当您fork时,子进程与父进程具有相同的信号处理程序。当你执行时,任何被忽略的信号都会被忽略;任何处理过的信号都会重置回默认处理程序。

+0

谢谢 - 这是我希望接受多于一个答案的时间之一:) –