Christian Kruse: fork => END-Blöcke in separatem Prozess ausführen

Beitrag lesen

Hoi,

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:

use POSIX qw/setsid/;

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;
}

Code, der lange dauert

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.

Gruesse,
 CK