views:

368

answers:

2

I want to write a robust daemon in perl that will run on Linux and am following the template described in this excellent answer. However there are a few differences in my situation: First I am using Parallel::ForkManager start() and next; to fork on an event immediately followed by exec('handle_event.pl')

In such a situation, I have the following questions:

  1. Where should I define my signal handlers. Should I define them in the parent (the daemon) and assume that they will be inherited in the children?
  2. If I run exec('handle_event.pl') will the handlers get inherited across the exec (I know that they are inherited across the fork)?
  3. If I re-define a new signal handler in handle_event.pl will this definition override the one defined in the parent?
  4. What are best practices in a situation like this?

Thank you

+3  A: 

The exec replaces the whole process code with the code that will be executed. As signal handlers are code in the process image, they cannot be inherited across an exec, so exec will reset the signal handling dispositions of handled signals to their default states (ignored signals will remain ignored). You will therefore need to install any signal handling in the execed process when it starts up.

jk
Thanks. That was very helpful and clear
Gurunandan
Not all signals will be set to default, if a signal is ignored it will still be ignored after the exec.
gorilla
@gorilla: Thanks! Answer amended.
jk
+2  A: 

When you fork, the child process has the same signal handlers as the parent. When you exec, any ignored signals remain ignored; any handled signals are reset back to the default handler.

Jonathan Leffler
Thanks - This is one of those times when I wish accepting more than one answer was possible :)
Gurunandan