Hackerboard WikiHaboBlog

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

forks(::shared) vs SIGINT

Diskussion: forks(::shared) vs SIGINT im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Hi! :) edit: ich merk' gerade dass das nur passiert wenn ich das Signal ueber Ctrl+C schicke, ein kill -SIGINT ...

Antwort
Alt 30.08.09, 14:17   #1 (permalink)
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Standard 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   
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":
Zitat:
[...] 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
keksinat0r ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » forks(::shared) vs SIGINT
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
perl threads::shared - diverse Probleme mit "shared" variablen keksinat0r Code Kitchen 4 22.02.09 18:43
threads::shared | threads->object() arbeitet nicht mit "shared" arrays keksinat0r Code Kitchen 0 23.08.08 14:11
VirtualBox und Shared Folders GambaJo Applikationen 4 01.01.08 16:13
shared memory CPU8080 Windows 3 23.05.06 19:10
shared memory grafikkarte a?+b?=c? Hardware Probleme 1 02.08.05 14:17


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61