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_signochamp spécifie le signal, lesigev_valuele 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_functionle champ spécifie la fonction qui est appelée,sigev_valuecontient des données supplémentaires qui sont transmises à la fonction, etsigev_notify_attributesspé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).