I have a supervisor program that generally wants to receive SIGCHLD
events. However, after it receives SIGTERM
or similar signal, it would be safe and desirable to ignore SIGCHLD
events to prevent zombies. The issue is that I'm not sure if it's legal to call signal(2)
when already inside a signal handler, so that e.g. SIGTERM
calls signal(SIGCHLD, SIG_IGN)
. It doesn't appear to cause problems, but I know there are many restrictions placed on what you can do in a signal handler, and I'm unable to figure out whether calling signal
is in the forbidden zone.
So: is this legal, reliably? If not, is there an alternative way to make sure that no children still running at the time of the SIGTERM
can possibly zombie, even if they aren't properly wait
ed on?
For Linux, look at the manpage for signal(7). There is a list of async-signal-safe functions. It says:
POSIX.1-2004 (also known as POSIX.1-2001 Technical Corrigendum 2) requires an implementation to guarantee that the following functions can be safely called inside a signal handler:
signal()
is in the list. So it's safe.