[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Überlebende Kindprozesse



Hi,

Frank Küster <frank <at> debian.org> writes:
> Normalerweise sterben Kinder mit; aber wenn sie hängen, dann hilft
> möglicherweise kill -15 nicht, und dann bleibt er übrig. 

dieses "normalerweise" ist nicht ganz so selbstverständlich. Oftmals
kommunizieren  Child und Parent über Pipes. Wird dann der Parent abgeschossen,
schließt sich auch die Pipe, das Kind erhält ein SIGPIPE-Signal und stirbt dann
auch, es sei denn, er fängt SIGPIPE ab.

Findet aber keine solche Kommunikation statt, lebt der Kindprozess weiter,
allerdings wird er nun zum Kind von Prozess Nr. 1, init.

Wenn du ein wenig von Perl verstehst, hier ein Beispiel:

$ cat <<EOF > /tmp/fork.pl
#!/usr/bin/perl
use warnings; use strict;

# Hier gibt es noch nur einen Prozess, den zukünfigen Vater.
# In dem wir fork()en, wird der Kind-Prozess als Klon des Vaters erzeugt:
my $child_pid = fork;
if($child_pid) {
  # Der Vater erhählt als Rückgabewert von fork() die PID des Childs.
  print "Parent (PID: $$) gestartet, Child-PID ist $child_pid.\n";
} else {
  # Das Kind erhält als Rückgabewert 0.
  print "Child (PID: $$) gestartet.\n";
}

# Hierhin kommen beide Prozesse, welche nun 20s warten.
sleep 20;

# Und jetzt beenden sich beide, und zeigen ihre PID ($$) an.
print "Prozess $$ beendet sich.\n";
EOF

$ /tmp/fork.pl &
$ ps axf | grep fork.pl
(Du wirst den Parent und sein Kind sehen.)
$ kill <Parent-PID>
$ ps axf | grep fork.pl
(Du wirst nur noch das Kind sehen, dessen Vater aber nun init ist.)
(Die zwanzig Sekunden Wartezeit sind vorbei:)
Prozess <Child-PID> beendet sich.



Reply to: