Why doesn't kill work?

Deron Meranda deron.meranda at gmail.com
Mon Feb 21 05:21:31 UTC 2005


On Sun, 20 Feb 2005 23:46:56 -0500, Scot L. Harris <webid at cfl.rr.com> wrote:
> So if the parent process crashes all of the child processes will be
> cleared?

When a parent process dies, all of it's children (whether currently
running or if they're zombies), are "inherited" by the main init
process, always process ID 1.  And init will always immediately reap
any zombies.  (Init is really a fake process which serves as the
process-face to the kernel itself.)  So in effect, if the parent process
of a zombie dies, then the zombies will immediately be reaped and
disappear almost immediately.


>  I thought the parent process had to issue an _exit() (or
> something similar) to get the child process status so it would exit
> cleanly.

The parent needs to call one of the wait() system calls [which
includes wait(), waitpid(), wait3(), wait4()].  That will return
to the parent the exit code that the kernel has been remembering;
and which also "reaps" the zombie and makes it disappear.
[Or, instead, the parent can tell the kernel to do auto-reaping
via the SA_NOCLDWAIT signal action flag.]

The exit() call is performed by a child process when it wishes
to pass back a specific exit code.  This is done automatically
in C/C++ when a return is made from main().  But, even if a
child doesn't call exit() because it terminated some other way
(like a core dump), the parent must still call wait().

It can be a little trickier on Linux, especially if you start
talking about advanced subjects like multithreaded processes
and the clone() system call.  But the most common case
is the child calls exit() and the parent calls wait().  The
time in between the two calls is when a zombie exists.


>  If it did not do that then the child process sits around
> waiting for the parent which is no longer running so it stays forever.

When a child dies, it dies.  It doesn't need to wait around on
any other process.  Of course a zombie may result, which only
means that the parent hasn't yet recognized that the child has
died.   The only exception is when the child process is currently
being traced (such as being debugged)..in which case the
tracing program must detach before the child actually dies.

-- 
Deron Meranda




More information about the fedora-list mailing list