The Linux Programming Interface says
26.3.1 Establishing a Handler for SIGCHLD
The SIGCHLD signal is sent to a parent process whenever one of its children termi- nates. By default, this signal is ignored, but we can catch it by installing a signal handler. Within the signal handler, we can use wait() (or similar) to reap the zombie child. However, there is a subtlety to consider in this approach.
26.3.3 Ignoring Dead Child Processes
There is a further possibility for dealing with dead child processes. Explicitly setting the disposition of SIGCHLD to SIG_IGN causes any child process that subsequently ter- minates to be immediately removed from the system instead of being converted into a zombie. In this case, since the status of the child process is simply discarded, a subsequent call to wait() (or similar) can’t return any information for the termi- nated child.
Note that even though the default disposition for SIGCHLD is to be ignored, explicitly setting the disposition to SIG_IGN causes the different behavior described here. In this respect, SIGCHLD is treated uniquely among signals.
What is the difference between the default disposition for SIGCHLD and explicitly setting the disposition to SIG_IGN?