Hoi,
ich werde mir das ansehen und versuchen, es zu verstehen - ich habe
noch nie 'geforkt'.
Sorry. Die Erklaerung habe ich vergessen. Also hier nachgereicht:
use POSIX qw/setsid/; # das Modul, das die POSIX-Schnittstelle nachbildet
....
my $pid = fork; # hier wird ein vollkommen gleichwertiger Prozess erzeugt
unless($pid) { # $pid ist 0 im Child-Prozess, undefined wenn fork nicht geklappt hat
die 'could not fork!' unless defined $pid; # tja, wie gesagt
# process is no longer a child
die 'could not remove session' unless setsid; # (1)
}
else {
# main process ends
exit 0; # (2)
}
(1) Tja, hier wird setsid benutzt, um das Kind aus der Prozessgruppe
herauszuloesen.
Prozesse sind unter Unix hierarchisch angeordnet. Das heisst, wenn du
dich einloggst auf deinem UNIX-System und ein 'ls' eingibst, dann
ist das 'ls' in Wahrheit schon ein Child, ein Child deiner Shell. Du
koenntest dir die Prozess-Struktur ungefaehr so vorstellen:
Kernel-Prozess
|
---- login
|
------- Shell
|
---------- ls
Wenn du jetzt zufaellig ein sehr langes ls hast ;-), und du killst
die Shell, weil es dir zu lange dauert, dann wird der SIGTERM (oder
auch SIGKILL) nicht nur an die Shell geschickt, sondern auch an das
ls. Dasselbe passiert beim Apachen:
Kernel-Prozess
|
------- Haupt-Apache-Prozess
|
------- Kind-Apache fuer den Request
|
--------- CGI-Prozess
|
---------- Kind des CGI-Prozesses
Das Signal hangelt sich also durch von CGI-Prozess zum Kind des
CGI-Prozesses. Deshalb muessen wir einen Weg finden, um setsid aus
der Prozess-Gruppe herauszuloesen und einen vollwertigen, eigenen
Haupt-Prozess daraus machen. Das uebernimmt setsid. Nach der
erfolgreichen Verwendung von setsid saehe die Prozess-Struktur so
aus:
Kernel-Prozess
|
+------ Haupt-Apache-Prozess
| |
| ------- Kind-Apache fuer den Request
| |
| --------- CGI-Prozess
|
|
------- Kind des CGI-Prozesses
Theoretisch duerfte der Apache also kein Signal mehr an das Kind
schicken. Das ist der ganze 'Trick' bei der Sache.
Wer mehr will, soll sich 'Advanced Programming In The UNIX(TM)
Environment' kaufen ;-)
Gruesse,
CK