To prevent the accumulation of zombie children, a parent should
wait to free their resources, it can do it in two ways
WNOHANG, to block until a child terminates
- Periodically perform a non blocking check (polling) using
It’s possible to launch a handler whenever a child terminates (without wasting resources on blocking or polling). However it’s possible that if
SIGCHLD are generated in quick succession some of them get lost, since they are not queue anywhere and the handler might be still executing for an already terminated child. A single wait inside the signal handler would not work. There is a smart solution:
In this way the parent wait for any child processes (pid = -1) and while there are zombie process (
waitpid() return value is
>0) it keep looping on calling wait.
SIGCHLD is delivered to the parent even when one of its children stops. To prevent that the flag
SA_NOCLDSTOP must be used in the signal handler flags (
sa.sa_flags = SA_NOCLDSTOP).