I recently received a bug report for my quick-and-dirty TCP debugging tool tcpconndbg where it was creating a large number of zombie processes. The person who filed the bug, Peter Viskup, was even kind enough to send a patch. While this is old news to anyone with extensive Unix programming experience, always remember the following:
If you create a child process using fork()
, you must either:
- Explicitly retrieve the child process’s exit code using one of the
wait()
functions (e.g.waitpid()
) - Tell the system that you aren’t interested in the child process’s exit code by using either:
sigaction()
with theSA_NOCLDWAIT
parameter (preferred)signal(SIGCHILD, SIG_IGN);
(for systems which do not supportsigaction()
)
As I fixed this bug, I realized I hadn’t looked at tcpconndbg in 5 years. My how programming style changes…