struct sigevent
non si tratta di specificare come il processo gestirà un segnale - struct sigaction
e sigaction()
ecco come lo fai. Invece, struct sigevent
viene utilizzato per specificare in che modo il tuo processo verrà informato di un evento asincrono, come il completamento dell'IO asincrono o la scadenza di un timer.
Il sigev_notify
Il campo specifica come deve essere notificato l'evento:
SIGEV_NONE
- nessuna notifica. Il resto dei campi viene ignorato.SIGEV_SIGNAL
- viene inviato un segnale al processo. Ilsigev_signo
il campo specifica il segnale, ilsigev_value
Il campo contiene dati supplementari che vengono passati alla funzione di gestione del segnale e il resto dei campi viene ignorato.SIGEV_THREAD
- una funzione viene chiamata in un nuovo thread. Ilsigev_notify_function
Il campo specifica la funzione che viene chiamata,sigev_value
contiene dati supplementari che vengono passati alla funzione esigev_notify_attributes
specifica gli attributi del thread da utilizzare per la creazione del thread. Il resto dei campi viene ignorato.
Nota in particolare che se imposti SIGEV_THREAD
, il sigev_signo
campo viene ignorato - il struct sigevent
si tratta di specificare o un thread o un segnale come metodo di notifica, non sullo specificare un thread come il modo in cui un segnale dovrebbe essere gestito.
Il struct sigevent
deve anche essere passato a una funzione, come timer_create()
- che imposta l'evento asincrono che verrà notificato. Semplicemente creando un struct sigevent
oggetto non fa niente di speciale.
Se desideri utilizzare un thread dedicato per gestire un segnale, crea il thread in primo piano e fallo girare intorno, bloccando su sigwaitinfo()
. Usa sigprocmask()
per bloccare il segnale in ogni altro thread.
Penso che tu stia confondendo i tuoi idiomi di gestione del segnale qui, crei un sigevent
structure e poi non fare nulla con esso e quindi utilizzare signal()
all'interno del gestore del segnale. Il codice seguente mostra una routine di gestione del segnale molto semplice basata sul codice; nota che ho cambiato la definizione di my_handler
. Se hai bisogno di una gestione più sofisticata allora sigaction()
è probabilmente la chiamata di sistema che devi esaminare.
#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!
}
Funziona sotto cygwin
sulla mia macchina Windows (nessun accesso a una macchina Linux al momento).