423ba10303
Signed-off-by: Nico Schottelius <nico@ikn.schottelius.org>
48 lines
2.3 KiB
Text
48 lines
2.3 KiB
Text
--------------------------------------------------------------------------------
|
|
Removing Zombies,
|
|
Nico Schottelius 2005-06-15 (Last Modified: 2005-06-15)
|
|
--------------------------------------------------------------------------------
|
|
|
|
First of all, the definition of a zombie:
|
|
|
|
''Defunct ("zombie") process, terminated but not reaped by its parent.''
|
|
[Excerpt from ps(1)]
|
|
|
|
''In the case of a terminated child, performing a wait allows the system to
|
|
release the resources associated with the child; if a wait is not performed,
|
|
then terminated the child remains in a "zombie" state (see NOTES below).
|
|
|
|
[...]
|
|
|
|
NOTES
|
|
A child that terminates, but has not been waited for becomes a "zom-
|
|
bie". The kernel maintains a minimal set of information about the
|
|
zombie process (PID, termination status, resource usage information)
|
|
in order to allow the parent to later perform a wait to obtain
|
|
information about the child. As long as a zombie is not removed
|
|
from the system via a wait, it will consume a slot in the kernel
|
|
process table, and if this table fills, it will not be possible to
|
|
create further processes. If a parent process terminates, then its
|
|
"zombie" children (if any) are adopted by init(8), which automati-
|
|
cally performs a wait to remove the zombies.''
|
|
[Excerpt from waitpid(2)]
|
|
|
|
So you can see, that if some process misbehaves and forgets about
|
|
its children, we, cinit, will adopt it. In the first versions of
|
|
cinit (cinit-0.0.1 <-> cinit-0.0.7) we ignored SIGCHLD. This way
|
|
the zombies stayed in the system. Since cinit-0.0.8 we have
|
|
sig_chld(), which removes the zombies.
|
|
|
|
So far so good. Now let's remove this feature. Yes, you heard right.
|
|
|
|
If cinit does not catch the zombies they will stay in the system.
|
|
Yes, that's ugly. And that's how it should be. You should see, which
|
|
software is broken and should contact the authors to fix it.
|
|
|
|
To restore the 'old' behaviour of cinit, change
|
|
generic/set_signals.c (ignore SIGCHLD)
|
|
Makefile: remove serv/sig_child.c from modules list
|
|
|
|
Still cinit will currently keep the behaviour of reaping the vestiges
|
|
broken software left behind (as it is cleaner for the system to
|
|
deallocate unused ressources).
|