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