forks(::shared) vs SIGINT

Hi! :)

edit: ich merk' gerade dass das nur passiert wenn ich das Signal ueber Ctrl+C schicke, ein kill -SIGINT scheint dieses Problem nicht zu verursachen?!
Gibt es irgendwelche Unterschiede zwischen Ctrl+C und kill -SIGINT?


Code:
use strict;
use warnings FATAL => 'all';

use forks;
use forks::shared;

### debugausgaben einschalten
threads->debug( 1 );

### signalhandler installieren
$SIG{$_} = eval 'sub{ print "$$: '. $_ .'\n" }' foreach keys %SIG;

### forks::shared arbeit geben
my $shared = threads::shared::shared_clone( {} );

### kindprozess starten
print "parent: $$\n";
threads->create(sub{
   print "child: $$\n";
   while( 1 ){
      print "child\n";
      sleep 1;

      if( getppid == 1 ){
         ### hier sollten wir NIE ankommen!
         print "$$ zombie-child?!\n";
         exit 0;
      }
   }
})->join; ### auf kindprozess warten

print "exit parent\n";


Nach dem SIGINT erhaellt der Vaterprozess ein SIGCHLD, welches wohl durch den forks::shared-prozess (der Bus, oder wie auch immer man ihn nennen mag) ausgeloest wird, da dieser stirbt.

Ich stelle mit nun aber die Frage warum der Vaterprozess ueberhaupt stirbt. Immerhin werden die Signale abgefangen!?

Eine weitere Frage die sich mir stellt ist, wie ich den Bus davon abhalten kann zu verrecken...

Nach dem SIGINT wuerde ich den Prozess gerne sauber beenden, was mir durch die Tatsache dass das Schreiben auf "shared" Variablen nach dem Tod des Busses ein SIGPIPE ausloest, dass den Tot des schreibenden Prozess verursacht (mir unerklaerlich, da SIGPIPE genau wie SIGCHLD abgefangen werden sollte) unmoeglich gemacht wird.

In der forks-Doku heisst es unter "Signal behavior":
[...] be aware that certain signals may untrappable [...], such as SIGKILL and SIGSTOP. Thus, it is recommended you only use normal signals (such as TERM, INT, HUP, USR1, USR2) for inter-thread signal handling.

Daher verstehe ich nicht warum er bei einem SIGINT Probleme macht...


Hat jemand einen Vorschlag wie ich das Problem beheben kann?


Code:
perl -v
   This is perl, v5.10.0 built for x86_64-linux-gnu-thread-multi

uname -a
   Linux [...] 2.6.30-1-amd64 #1 SMP Sat Aug 15 18:09:19 UTC 2009 x86_64 GNU/Linux


MfG - Keks
 
Zurück
Oben