struct sigevent
geht es nicht darum, anzugeben, wie der Prozess mit einem Signal umgehen soll - struct sigaction
und sigaction()
so machst du das. Stattdessen struct sigevent
wird verwendet, um anzugeben, wie Ihr Prozess über ein asynchrones Ereignis informiert wird - wie z. B. den Abschluss einer asynchronen E/A oder das Ablaufen eines Timers.
Die sigev_notify
Feld gibt an, wie das Ereignis benachrichtigt werden soll:
SIGEV_NONE
- überhaupt keine Benachrichtigung. Die restlichen Felder werden ignoriert.SIGEV_SIGNAL
- Ein Signal wird an den Prozess gesendet. Diesigev_signo
Feld spezifiziert das Signal, densigev_value
enthält ergänzende Daten, die an die Signalverarbeitungsfunktion übergeben werden, und die restlichen Felder werden ignoriert.SIGEV_THREAD
- Eine Funktion wird in einem neuen Thread aufgerufen. Diesigev_notify_function
Feld gibt die aufgerufene Funktion an,sigev_value
enthält ergänzende Daten, die an die Funktion übergeben werden, undsigev_notify_attributes
gibt Thread-Attribute an, die für die Thread-Erstellung verwendet werden sollen. Die restlichen Felder werden ignoriert.
Beachten Sie insbesondere, dass wenn Sie SIGEV_THREAD
setzen , die sigev_signo
Feld wird ignoriert - der struct sigevent
geht es darum, entweder anzugeben ein Thread oder ein Signal als Benachrichtigungsmethode, nicht darum, einen Thread als Art und Weise anzugeben, wie ein Signal gehandhabt werden soll.
Die struct sigevent
muss auch an eine Funktion übergeben werden - wie timer_create()
- das das asynchrone Ereignis einrichtet, das benachrichtigt wird. Einfach einen struct sigevent
erstellen Objekt macht nichts Besonderes.
Wenn Sie einen dedizierten Thread verwenden möchten, um ein Signal zu verarbeiten, erstellen Sie den Thread im Voraus und lassen Sie ihn herumschleifen und auf sigwaitinfo()
blockieren . Verwenden Sie sigprocmask()
um das Signal in jedem anderen Thread zu blockieren.
Ich glaube, Sie verwechseln hier Ihre Signalhandhabungssprache, Sie erstellen einen sigevent
Struktur und dann nichts damit machen und dann signal()
verwenden innerhalb des Signalhandlers. Der folgende Code zeigt eine sehr einfache Signalbehandlungsroutine, die auf Ihrem Code basiert; Beachten Sie, dass ich die Definition von my_handler
geändert habe . Wenn Sie eine anspruchsvollere Handhabung benötigen, dann sigaction()
ist wahrscheinlich der Systemaufruf, den Sie untersuchen müssen.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
void my_handler(int sig)
{
printf("my_handler caught\n");
signal(sig,my_handler);
}
int main()
{
signal(SIGRTMIN,my_handler);
kill(0,SIGRTMIN); // This should invoke the signal and call the function
while(1) ; // Infinite loop in case the program ends before the signal gets caught!
}
Dies funktioniert unter cygwin
auf meiner Windows-Box (momentan kein Zugriff auf eine Linux-Box).