Philipp Hasenfratz: fork => END-Blöcke in separatem Prozess ausführen

Beitrag lesen

Halihallo Christian

Ich hab mir deinen Vorschlag zu Herzen genommen: ;)

use POSIX qw/setsid _exit/;

my $pid = fork;
unless($pid) {
  die 'could not fork!' unless defined $pid;
  # process is no longer a child
  open STDOUT, '/dev/null';
  die 'could not remove session' unless setsid;
}
else {
  # main process ends
  POSIX::_exit(0);
}

END {
   print 'test';
   open( F, '>>test.txt' );
   print F 'test'."\n";
   close F;
}

leider musste ich das POSIX::_exit stehen lassen, da, wie bereits gesagt, sonst die END-Blöcke und DESTROY's (gut, die wären ja OK) gleich in beiden Prozessen abgearbeitet. Das funktioniert so auch, wie erwartet (getestet auf cygwin).

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.

Also, wenn ich dich hier recht verstehe, dann erreichst du mit setsid eine komplette Trennung zwischen dem Parent und dem Child (das ist wohl mit Session gemeint), also kein Risiko auf Zombies, kein Risiko, dass der Parentprozess (GUI-Programm) durch den Child "aufgehalten" wird. Ist diese Aussage richtig?

Viele Grüsse und Danke nochmals

Philipp