Zombies im Prozessbaum

Lutz Donnerhacke lutz at iks-jena.de
Mon Nov 24 10:12:46 CET 2003


* Johannes Vieweg wrote:
> Am Sonntag, 23. November 2003 20:33 schrieb Lutz Donnerhacke:
>> Nein. Stirbt der Papa, geht das Kind unmittelbar an PID 1 (aka init).
>
> So?

Ja.

> Wieso ist dann netstat laut pstree dem mozilla zugewiesen gewesen?

Weil mozilla pstree aufgerufen hat oder das direkte mozilla-Kind exec zu
netstat ausführte.

> Designfehler? Zufall?

Fakt.

> Und - warum hat sich dann der Zombie sooo lange im Prozessbaum
> rungetrieben?

Weil der Papa noch läuft, und kein wait aufruft. Evtl. macht er das nicht,
weil er SIGCHLD nicht verstanden hat (ein Signal können mehrere Kinder sein,
man muß wait in einer Schleife aufrufen).

Wenn man aber in den Code schaut: kernel/exit.c, so könnte man Deinem
Argument folgen, weil dort Threads dem Vaterprozess zugeordnet werden. Dies
gilt aber nicht für Prozesse, sondern wirklich nur für Threads.


_EXIT(2)                   Linux Programmer's Manual                  _EXIT(2)

NAME
       _exit - terminate the current process

SYNOPSIS
       #include <unistd.h>

       void _exit(int status);

DESCRIPTION
       _exit  terminates  the  calling  process  immediately.  Any  open  file
       descriptors belonging to the process are closed; any  children  of  the
       process  are  inherited by process 1, init, and the process's parent is
       sent a SIGCHLD signal.

       status is returned to the parent process as the process's exit  status,
       and can be collected using one of the wait family of calls.

RETURN VALUE
       _exit never returns.

CONFORMING TO
       SVr4, SVID, POSIX, X/OPEN, BSD 4.3

NOTES
       _exit  does  not  call  any functions registered with the ANSI C atexit
       function and does not flush standard I/O buffers. To do  these  things,
       use exit(3).

SEE ALSO
       fork(2), execve(2), waitpid(2), wait4(2), kill(2), wait(2), exit(3)

Linux                            21 July 1993                         _EXIT(2)