UNIX/Linux de traitement de signal: SIGEV_THREAD
J'ai mis un simple gestionnaire de signal dans mon code. J'ai initialisé le sigevent la structure, avec une fonction de gestionnaire pour attraper le signal.
Quelqu'un peut merci de pin-point pourquoi le code ne fonctionne pas? Idéalement, si il y a un signal, mon gestionnaire doit être appelé. Mais il ne l'est pas.
Merci de m'aider,
Merci
Kingsmasher1
enter code here
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
void my_handler(int sival_int, void* sival_ptr)
{
printf("my_handler caught\n");
signal(sig,my_handler);
}
int main()
{
struct sigevent sevp;
sevp.sigev_notify=SIGEV_THREAD;
sevp.sigev_signo=SIGRTMIN;
sevp.sigev_value.sival_ptr=NULL;
sevp.sigev_notify_function=(void*)my_handler;
kill(0,SIGRTMIN); //This should invoke the signal and call the function
}
OriginalL'auteur kingsmasher1 | 2011-03-01
Vous devez vous connecter pour publier un commentaire.
struct sigevent
n'est pas sur la spécification de la manière dont le processus va gérer un signalstruct sigaction
etsigaction()
sont la façon de le faire. Au lieu de cela,struct sigevent
est utilisé pour spécifier comment votre processus sera informé de certains asychronous événement - comme l'achèvement de asychronous IO, ou une minuterie expire.La
sigev_notify
champ spécifie la façon dont l'événement doit être notifiée:SIGEV_NONE
- pas de notification à tous. Le reste des champs sont ignorés.SIGEV_SIGNAL
- un signal est envoyé au processus. Lesigev_signo
champ spécifie le signal, lasigev_value
champ contient des données supplémentaires qui est passé à la gestion des signaux de la fonction, et le reste des champs sont ignorés.SIGEV_THREAD
- une fonction est appelée dans un nouveau thread. Lesigev_notify_function
champ spécifie la fonction qui est appelée,sigev_value
contient des données supplémentaires qui est passé à la fonction, etsigev_notify_attributes
spécifie fil des attributs à utiliser pour la création de thread. Le reste des champs sont ignorés.En particulier de noter que si vous définissez
SIGEV_THREAD
, lesigev_signo
champ est ignoré - lestruct sigevent
est sur la spécification soit un thread ou un signal comme une méthode de notification, et non pas sur la définition d'un thread que de cette façon qu'un signal doit être traitée.La
struct sigevent
doit également être transmis à une fonction - commetimer_create()
- qui met en place le asychronous événement qui sera notifié. Il suffit de créer unestruct sigevent
objet n'est pas de faire quelque chose de spécial.Si vous souhaitez utiliser un thread dédié pour traiter un signal de créer le fil de l'avant et avoir tourner en boucle autour de, bloque sur
sigwaitinfo()
. Utilisationsigprocmask()
pour bloquer le signal dans toutes les autres fil.OriginalL'auteur caf
Je pense que vous mélangez votre traitement de signal idiomes ici, vous créez un
sigevent
structure et ne rien faire avec elle, puis utilisersignal()
dans le gestionnaire de signal. Le code suivant montre un très simple routine de traitement de signal en fonction de votre code; à noter que j'ai changé la définition demy_handler
. Si vous avez besoin de plus sophistiqué de la manipulation alorssigaction()
est probablement l'appel système, vous devez regarder dans.Cela fonctionne sous
cygwin
sur ma boîte de windows (pas d'accès à une machine linux à la minute).sigevent
logiquement être le problème, donc +1.Cette methos je suis au courant, mais je veux utiliser le sigevent et l'utilisation de la SIGEV_THREAD pour appeler la fonction. Si vous pouvez s'il vous plaît m'aider dans cette voie, ça va être super
À partir d'une brève chalut par les docs, le problème que vous avez est que sigevent est sur la gestion des événements pas à propos de traitement de signal. Il semble que vous souhaitez appeler un gestionnaire de signal dans un nouveau thread à chaque fois que le SIGRTMIN signal est reçu par votre processus tandis que sigevent est utilisé pour des choses comme async io (voir l'aio pages de man). Vous avez besoin de regarder les docs du signal, () et si votre système d'exploitation prend en charge sigaction() pour voir ce que vous pouvez faire.
OriginalL'auteur Jackson
J'espère que cela fonctionne.
OriginalL'auteur Suganthan Sundaram