[Vienna-pm] unterschiedliches SIGNAL-Trapping in den Childs und der Mama

gooly at gmx.at gooly at gmx.at
Thu Apr 5 00:39:39 PDT 2007


Am Mittwoch, 4. April 2007 schrieb Leopold Toetsch:
> Am Mittwoch, 4. April 2007 11:02 schrieb gooly at gmx.at:
> > Danke Euren Antworten!
> >
> > > > ich hab ein Perl.prg, das mehrere (threaded) Kinder zeugt.
> > > > Da soll nun jedes ein eigenes gracefull-die hinlegen - wie geht
> > > > das?
> > >
> > > Nach POSIX ist es nicht/kaum spezifiziert[1], welcher der threads
> > > überhaupt das gesendete Signal erhält. Der Prozess beinhaltet je
> > > nach System und Implementierung alle Threads oder nicht.
> >
> > hmm - ab ins Labor ;) und wieder da :(
> >
> > da ich verschiede threaded Variablen benötige habe ich threads,
> > threads::shared verwendet und eben nicht fork. In threads gäbe es
> > ja auch das $thr->kill('KILL'), aber auch davon kriegt das Kind nix
> > mit - es stirbt halt einfach lautlos, ohne die Chance auf einen
> > Seufzer..
>
> Das hat hp ja schon beantwortet.
>
> Wenn es nur um ein "gracefull-die" geht, sind Signale sowieso der
> falsche Ansatz, wie in 99% aller anderen Fälle auch ;)
>
> Du brauchst nur eine shared Variable e.g. $running, und die
> "Endlos"-Schleife der Kinder ist dann:
>
> while ($running) {
>   do_some_work();
> }
>
> Diese Variable kannst du fallweise auch per SIG-Handler in der Mama
> resetten.
Das ist das, was auch im Beispiel pool.pl gemacht wird, das auf der 
cpan-Seite von threads verlinkt ist, aaber diese Lösung bedeutet, dass 
dieser shared Variable mindestens jede Sekunde, besser noch kürzer 
abgefragt wird, auch wenn das Kind eigentlich nichts zu tun hätte - 
hmm. Ein:
	while (1) {
	   ...
	   sleep (300);
	   ...
	}
lässt dies ins leere Laufen.
Auf dem cpan-Board zu therads hab ich mein Ansinnen gepostet und gestern 
gerade noch bevor zum ballettwettbewerb ins Theater-Akzent ging 
gesehen, dass der Betreuer von threads eine Lösung gepostet hat - die 
werd ich mir jetzt anschauen - später dazu dann mehr ..
> > > Auf der sicheren Seite bist du nur, wenn du alle Signale
> > > blockierst, und genau für den einen emfangenden Thread
> > > freischaltest [2].
> >
> > hmm, wie mach ich das?
>
> Wie gesagt die Zeilen ueber sigaction in `info libc` 
> und weiter  unten.
hmm - C.
Vielleicht ist's ja doch nicht nötig, ich benutze ja gerade Perl um 
nicht in C für jedes kleinste Detail selber zuständig zu sein ..

>
> > > Eine Unbekannte dazwischen ist noch die Implentierung innerhalb
> > > Perl selber, aber ich nehme mal an, dass das halbwegs transparent
> > > ist und die libc Dokumentation für die Anwendung in Perl noch
> > > gültig ist (modulo der Signalhandler selber natürlich).
> >
> > Huch, ist das etwas 'was in Perl *nicht* geht - das gibt's??
>
> Ich habe nicht gesagt dass es nicht geht. Allerdings bist du hier
> ziemlich nahe an der glibc bzw libpthread und die Implementierung in
> Perl könnte hinderlich sein. Ich habe das auch noch nie in Perl
> probiert nur in C.
>
> > > file:///home/lt/doc/susv3/functions/xsh_chap02_04.html#tag_02_04_
> > >01
> >
> > Naja, wie kann ich das den umsetzen? Hast Du, kennst Du, weißt Du
> > wo es dazu (ein) Beispiel(e) gibt - Ich vermute man könne/müsste es
> > mit bash abfangen?
>
> Bash - kaum. In C schaut's z.B so [1] aus.
>
> > > [2] sorry, aber die docs musst du IIRC downloaden und lokal
> > > installieren
> >
> > was meinst Du?
> > Das 'xsh_chap02_04.html' hab ich jetzt, meinst Du das?
>
> Yep.
>
> leo
>
> [1]
> Snippets aus Parrot's event code (src/events.c). Die Idee ist:
> a) im Hauptthread werden Signalhandler installiert und Signale
> blockiert bevor Threads erzeugt wurden.
> b) in dem Thread, der die Signale bekommen soll, wird das Signal
> freigeschaltet.
> c) The translation to Perl is left as an exercise for the reader.
why not to some students at university and published hereafter?
> ad a)
>
> static void
> Parrot_sigaction(int sig, void (*handler)(int))
> {
>     struct sigaction action;
>     sigset_t block_mask;
>
>     /* install handler */
>     action.sa_handler = handler;
>     sigemptyset(&action.sa_mask);
>     action.sa_flags = 0;
>     sigaction(sig, &action, NULL);
>
>     /* block that signal */
>     sigemptyset(&block_mask);
>     sigaddset(&block_mask, sig);
>     sigprocmask(SIG_BLOCK, &block_mask, NULL);
> }
>
> ...
>     Parrot_sigaction(SIGHUP, sig_handler);
> ...
>
> ad b)
>
> /*
>  * unblock a signal
>  */
> static void
> Parrot_unblock_signal(int sig)
> {
>     sigset_t block_mask;
>
>     sigemptyset(&block_mask);
>     sigaddset(&block_mask, sig);
>     sigprocmask(SIG_UNBLOCK, &block_mask, NULL);
> }
>
> ...
>     Parrot_unblock_signal(SIGHUP);
> ...

Danke,
später dazu mehr, ;) muss jetzt wieder ins Labor..
Calli


More information about the Vienna-pm mailing list