struct sigevent
il ne s'agit pas de spécifier comment le processus traitera un signal - struct sigaction
et sigaction()
c'est comme ça que tu fais ça. Au lieu de cela, struct sigevent
est utilisé pour spécifier comment votre processus sera informé d'un événement asynchrone - comme l'achèvement d'une E/S asynchrone ou l'expiration d'un temporisateur.
Le sigev_notify
champ spécifie comment l'événement doit être notifié :
SIGEV_NONE
- aucune notification du tout. Le reste des champs est ignoré.SIGEV_SIGNAL
- un signal est envoyé au processus. Lesigev_signo
champ spécifie le signal, lesigev_value
le champ contient des données supplémentaires qui sont transmises à la fonction de traitement du signal, et le reste des champs est ignoré.SIGEV_THREAD
- une fonction est appelée dans un nouveau thread. Lesigev_notify_function
le champ spécifie la fonction qui est appelée,sigev_value
contient des données supplémentaires qui sont transmises à la fonction, etsigev_notify_attributes
spécifie les attributs de thread à utiliser pour la création de thread. Le reste des champs est ignoré.
Notez en particulier que si vous définissez SIGEV_THREAD
, le sigev_signo
le champ est ignoré - le struct sigevent
consiste à spécifier soit un fil ou un signal comme méthode de notification, pas sur la spécification d'un fil comme mode de traitement d'un signal.
Le struct sigevent
doit également être passé à une fonction - comme timer_create()
- qui met en place l'événement asynchrone qui sera notifié. Créer simplement un struct sigevent
l'objet ne fait rien de spécial.
Si vous souhaitez utiliser un thread dédié pour gérer un signal, créez le thread à l'avance et faites-le tourner en boucle, en bloquant sur sigwaitinfo()
. Utilisez sigprocmask()
pour bloquer le signal dans tous les autres threads.
Je pense que vous mélangez vos idiomes de traitement du signal ici, vous créez un sigevent
structure puis ne rien faire avec et ensuite utiliser signal()
dans le gestionnaire de signal. Le code suivant montre une routine de gestion de signal très simple basée sur votre code ; notez que j'ai changé la définition de my_handler
. Si vous avez besoin d'une manipulation plus sophistiquée, alors sigaction()
est probablement l'appel système que vous devez examiner.
#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!
}
Cela fonctionne sous cygwin
sur ma box windows (pas d'accès à une box linux à la minute).