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

Leopold Toetsch lt at toetsch.at
Wed Apr 4 11:38:46 PDT 2007


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.

> > 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.

> > 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.

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);
...


More information about the Vienna-pm mailing list