GNU/Linux >> Tutoriels Linux >  >> Linux

Gestion des signaux UNIX/Linux :SIGEV_THREAD

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. Le sigev_signo champ spécifie le signal, le sigev_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. Le sigev_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, et sigev_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).


Linux
  1. 50 didacticiels d'administration système UNIX / Linux

  2. UNIX / Linux :3 façons d'envoyer un signal aux processus

  3. Principales différences entre les noyaux Linux et UNIX

  4. Service Linux / UNIX OS :autofs

  5. Traitement du signal avec plusieurs threads sous Linux

Commande mkdir sous Linux/Unix

Linux contre Unix

Commande Grep sous Linux/UNIX

Commande ls sous Linux/UNIX

commande cp sous Linux/UNIX

Rechercher la commande sous Linux/UNIX