Halihallo Christain
use POSIX;
$SIG{CHLD} = 'IGNORE';
wird beim beenden gestartet:
my $pid = fork();
die 'could not fork' unless (defined $pid);
if ($pid == 0) {
# child
close STDOUT; close STDERR;
open( STDOUT, '>./t.txt' );
exit(0); # calls END Blocks on Schedulers (Automatisms)
} else {
# parent, $pid is child-pid
POSIX::_exit(0); # no END Block is ever called -> exits immediately
}
Mach das mal richtig und sauber:
OK. Versuche ich mal ;)
use POSIX qw/setsid/;
warum brauche ich den Session Identifier? - In der Doku hab ich nix gefunden, warum ich den explizit angeben muss. Kannst (oder wer anders) du es als fork/linux Experte erleutern?
my $pid = fork;
unless($pid) {
die 'could not fork!' unless defined $pid;
# process is no longer a child
die 'could not remove session' unless setsid;
}
else {
# main process ends
exit 0;
}
Das kommt ja etwa auf das selbe raus, was ich getan hab, oder?
Dein Getrickse mit POSIX::_exit() ist da voellig ueberfluessig und verwirrt
nur. Der 'Trick' ist hier recht einfach: der Child wird aus der Prozess-Gruppe
herausgeloest und bekommt eine eigene Session.
Bist du dir sicher? - Das Problem mit exit(0) ist, dass der Prozess dann eben weiterläuft und der Perlinterpreter die END-Blöcke _auch_ ausführt (wie beim 'die'/'exit', dort werden auch DESTROY jedes Objektes aufgerufen). Es geht jedoch darum, dass der "Parent-Prozess", sprich das vom Kunden aufgerufene GUI Programm jene END-Blöcke _nicht_ aufruft und dies in einen separaten Prozess ausgelagert wird (btw. was ist eine session? - Klingt irgendwie nach Thread?). Dies erreicht man durch die C-Funktion POSIX::_exit(), dort wird selbst der Perlinterpreter abgewürgt.
Viele Grüsse und Danke für deine Antwort.
Philipp