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_NOCLDWAITparameter (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…