Maison  >  Article  >  développement back-end  >  Comment gérer gracieusement les interruptions Ctrl-C en C avec la fonction Sigaction ?

Comment gérer gracieusement les interruptions Ctrl-C en C avec la fonction Sigaction ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-13 01:35:02476parcourir

How to Gracefully Handle Ctrl-C Interrupts in C   with the Sigaction Function?

Intercepter les événements Ctrl-C en C

Intercepter les événements Ctrl-C est une tâche nécessaire en programmation, surtout lorsque vous souhaitez répondre gracieusement à interruptions inattendues.

Utiliser Sigaction

En C, il est plus fiable d'utiliser la fonction sigaction pour gérer les signaux. La syntaxe est la suivante :

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

Où :

  • signum : Le numéro du signal à traiter, pour Ctrl-C, c'est SIGINT.
  • act : Spécifie l'action du nouveau gestionnaire de signal.
  • oldact : stocke le comportement précédent.

Dans l'exemple donné par Thomas, la structure sigaction est la suivante :

struct sigaction sigIntHandler;

sigIntHandler.sa_handler = my_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;

Où :

  • sa_handler : pointe vers la fonction handler .
  • sa_mask : Le masque de signal à empêcher lors du traitement de ce signal.
  • sa_flags : indicateurs supplémentaires, généralement 0.

Utilisez cette structure de sigaction avec le signal SIGINT :

sigaction(SIGINT, &sigIntHandler, NULL);

Fonction de gestionnaire

Enfin, vous avez besoin d'une fonction de gestionnaire pour répondre au signal. Dans l'exemple, my_handler imprime simplement un message et quitte le programme :

void my_handler(int s){
   printf("Caught signal %d\n", s);
   exit(1);
}

Code complet

Voici le code complet utilisant sigaction pour capturer les événements Ctrl-C :

#include 
#include 
#include 
#include 

void my_handler(int s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{

   struct sigaction sigIntHandler;

   sigIntHandler.sa_handler = my_handler;
   sigemptyset(&sigIntHandler.sa_mask);
   sigIntHandler.sa_flags = 0;

   sigaction(SIGINT, &sigIntHandler, NULL);

   pause();

   return 0;    
}

En utilisant sigaction, vous pouvez détecter de manière fiable les événements Ctrl-C et prendre les mesures appropriées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn