Signale und pthreads

From: Harold Gutch <logix(at)foobar.franken.de>
Date: Thu, 2 Mar 2017 00:51:23 +0100

Hi,

ich bin heute über eine Sache gestolpert die ich nicht verstehe.

Zunächst:

#include <signal.h>
#include <stdio.h>

void handler(int sig) {
        printf("sig handler!\n");
}

int main(int argc, char *argv[])
{
        struct sigaction sa;

        signal(SIGHUP, handler);
        sigaction(SIGHUP, NULL, &sa);
        printf("handler: 0x%x\n", (int) handler);
        printf("sa.sa_handler: 0x%x\n", (int) sa.sa_handler);
}

Übersetzt man das mit "cc -o test test.c" und startet es, so wird (wie
erwartet) zweimal dieselbe Adresse ausgegeben - sigaction() liefert in
der Tat den eben eingerichteten Handler zurück. Übersetzt man das
ganze aber mit "cc -o test test.c -pthread" (wer es genau haben will
darf gerne noch ein "#include <pthread.h>" einfügen), dann heißt es
"sa.sa_handler: 0x0".

Wenn ich anstatt signal(SIGHUP, handler) den signal handler mit
sigaction() einrichte, also anstatt des signal() oben das hier:

        bzero(&sa, sizeof(sa));
        sa.sa_handler = handler;
        sigaction(SIGHUP, &sa, NULL);

dann ist die Ausgabe in beiden Fällen "richtig". Der signal handler
selbst scheint übrigens in jedem der 4 Fälle richtig eingerichtet zu
werden, verifiziert mit einer Endlosschleif Ende und einem "kill -HUP
<pid>".

Ist das ein Bug, fehlt in einer man page der Hinweis dass man selbst
bei nur 1 Thread kein signal() und -pthread kombinieren kann oder (meine
Vermutung...) habe ich irgendwas nicht richtig verstanden?

Das ganze ist ein FreeBSD 10.2-RELEASE, ich kam jetzt nicht dazu
andere FreeBSD-Versionen zu testen.

Danke für jegliche Hinweise,
  Harold

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Thu 02 Mar 2017 - 00:51:28 CET

search this site