Halihallo Marc04
my $pid = fork();
$pid == 0 beim Child-Prozess
$pid == integer-Wert der ProzessId des Childs im Parent.
die $! unless defined $pid;
OK.
if($pid == 0) { die $! unless setsid(); }
Hier geschieht zwar die genannte Fallunterscheidung zwischen Parent
und Child, jedoch führt der Child nach dem if-Block wieder genau
dieselben Sachen aus, wie der Parent.
Vielleicht kann ich es hierdurch etwas klarer beschreiben:
#!/usr/bin/perl
sub thisDoesTheParent() {
print "Content-Type: text/html\015\012\015\012";
print "Alle Ausgaben des Parents!";
}
sub thisDoesTheChild() {
setsid();
# der _Child_ muss nix ausgeben, der _Parent_ (s. oben) schon!
close(STDOUT);
close(STDERR);
...
# Aufgaben des Childs!
}
if (fork()) {
### wahr, wenn fork() die ProzessId des Childs returniert =>
### wir sind also im ParentProzess.
thisDoesTheParent();
} else {
### keine pid => unwahr => wir sind also im ChildProzess
thisDoesTheChild();
}
exit();
close STDIN;
close STDOUT;
close STDERR;
Wie? - Wie oft denn noch: In deinem Programm werden die
Ausgabehandler des Childs, sowie auch dem Parent geschlossen und
somit bekommt man berechtigterweise einen 500er!
---
Ich habe einige Fehlerbehandlungen jetzt ausgelassen, um die Sache
nicht noch unnötig zu komplizieren. Hoffe, dass dies jetzt klar
geworden ist.
Viele Grüsse
Philipp
Any given program, when running, is obsolete.