Let's say I have a C program which spawns some child processes using fork()
and exec()
. The parent keeps a list of the pid
s of its children. Once in a while, it tries wait
ing on them using WNOHANG
and informs the user if they have terminated.
The program then decides to exit. Must I explicitly kill
and then wait
on the remaining child processes so that they don't become zombies? According to Wikipedia:
"Zombie processes should not be confused with orphan processes: an orphan process is a process that is still executing, but whose parent has died. These do not become zombie processes; instead, they are adopted by init (process ID 1), which waits on its children."
So this suggests waiting is unnecessary. But what if the program's children have already become zombies, and the program exits before waiting on them? Basically, will a parent's child processes who are zombies always be reclaimed properly if the parent exits?
No, that is the practical definition of a zombie process. Technically a zombie process is any process that has terminated but is still in the process table; however, it's not harmful if the parent process is still around to read the process table and note that the child terminated. A process is more meaningfully a zombie if the parent exits without reading the process table and causing the dead child to be "reaped". However, modern
init
should quicklywait
on any undead children preventing longstanding zombies from roaming the system.If you consider this carefully, it means all child processes that terminate become zombies for some period of time.
UNIX is morbid.
When a process exits, all children become children of process 1 (init). It will promptly reap all zombies. Any children still running will remain running as children of process 1.
Some may argue that it's better to reap your zombies before exiting but it doesn't really matter.