Philipp Hasenfratz: premature end of script headers

Beitrag lesen

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.