From: Douglas A. Gwyn <gwyn@ix.netcom.com> Newsgroups: comp.lang.c Subject: Re: Terminating a child process Date: Mon, 13 Oct 1997 00:18:50 GMT The main problem is that you neglected to wait() on the children; so long as their parent exists, terminated children remain in a "zombie" state so that there is a place to keep their exit status, which is made available to the wait()er. When they have been "orphaned", i.e. their parent has terminated, they are inherited by a "reaper" process (traditionally part of init, PID#1), which quickly lays them to rest by wait()ing on them. In cases where the parent does not find it convenient to wait on the children, a useful trick is to make them grandchildren instead, with the intermediate child process immediately dying; as just described, that means that the children will be immediately inherited by PID#1, so when they terminate they won't be zombies for more than an instant. if ((pid=fork())==0) // child process if ((pid=fork())>0) _exit(0); // child suicides after spawning else if (pid<0) // error handle_failure_to_fork(pid); else { // pid==0 // grandchild do_slave_processing(); _exit(0); // status sent to PID#1 } else // parent process if (pid<0) // error handle_failure_to_fork(); else // wait for (immediate) suicide of child while (waitpid(pid,&status,0)<0 && errno==EINTR) ; // wait interrupted by signal, try again |