2016-07-24 43 views
1

Wie kann ich Argumente (z. B. einen Zeiger auf eine Struktur) an einen Signal-Handler übergeben? Ich schreibe eine Multithread-Anwendung, daher kann ich keine globalen Variablen verwendenÜbergeben von Argumenten an den Signalhandler in C

Ich verknüpfe einen Timer mit jedem Thread. Wenn der Timer abläuft, muss ich eine Struktur aktualisieren (jeder Thread hat eine andere Struktur).

Wie kann ich tun?

+0

Wie wäre es dann mit einer Thread-lokalen Variable? –

+0

Wie kann ich eine thread-lokale Variable an den Signal-Handler übergeben? – WindowsEFI

+0

Können Sie klarer sein? Sagen Sie uns, was ist die Art von Signal? Und was ist das Format der Ausgabe, die Sie wünschen! –

Antwort

0

Die Art, wie der Signal-Handler vom System aufgerufen wird, ist behoben - es gibt keine Möglichkeit, ihn zu ändern und einen zusätzlichen Benutzerzeiger hinzuzufügen. Wenn Sie also zusätzliche Daten in den Signal-Handler holen möchten, können Sie dies nur mit einer globalen Variablen tun (die Thread-lokal sein könnte).

Wenn Sie jedoch versuchen, timer_create mit Threads zu verwenden, sind Sie viel besser mit SIGEV_THREAD anstatt SIGEV_SIGNAL. Letzterer sendet das Signal an den Prozess anstelle des Thread, so dass es möglicherweise von einem Thread in diesem Prozess abgefangen wird.

+0

glibc scheint Variablen _Thread_local träge und dynamisch zuzuordnen (mit malloc-Aufrufen, die erfolgreich sind oder sterben, was ich nicht sehr mag), so scheint es zumindest der erste Zugriff auf _Thread_local könnte AS-unsicher sein. Ich konnte jedoch keine weiteren Informationen dazu finden. – PSkocik

0

POSIX-Timer ermöglichen die Angabe, wie Ihr Prozess über die struct sigevent Struktur, die in sigevent(7) dokumentiert ist, über einen Ablauf informiert wird.

Um Kontext Informationen zum siggnal Handler für das erzeugte Signal passieren, können Sie das .sigev_value.sival_ptr Mitglied eingestellt, die Ihr Handler Signal wird dann in der Lage sein, abrufen (Sie werden die Signal-Handler über das .sa_sigaction Mitglied struct sigaction festlegen müssen , während Sie sicherstellen, dass die Struktur .sa_flags ORred mit SA_SIGACTION ist).