Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Langue C

Gestion des signaux C++

Les signaux sont les interruptions délivrées à un processus par le système d'exploitation qui peuvent terminer un programme prématurément. Vous pouvez générer des interruptions en appuyant sur Ctrl+C sur un système UNIX, LINUX, Mac OS X ou Windows.

Certains signaux ne peuvent pas être captés par le programme, mais il existe une liste suivante de signaux que vous pouvez capter dans votre programme et pouvez prendre les mesures appropriées en fonction du signal. Ces signaux sont définis dans le fichier d'en-tête C++ .

SIGABRT

Arrêt anormal du programme, tel qu'un appel à abandonner .

SIGFP

Une opération arithmétique erronée, telle qu'une division par zéro ou une opération entraînant un débordement.

SIGILL

Détection d'une instruction illégale.

SIGINT

Réception d'un signal d'attention interactif.

SIGSGV

Un accès invalide au stockage.

SIGTERM

Une demande de résiliation envoyée au programme.

Sr.No Signal et description
1
2
3
4
5
6

La fonction signal()

La bibliothèque de gestion des signaux C++ fournit la fonction signal pour piéger les événements inattendus. Voici la syntaxe de la fonction signal() −

void (*signal (int sig, void (*func)(int)))(int); 

Pour faire simple, cette fonction reçoit deux arguments :le premier argument sous la forme d'un entier qui représente le numéro du signal et le second argument sous la forme d'un pointeur vers la fonction de gestion du signal.

Écrivons un programme C++ simple où nous capterons le signal SIGINT en utilisant la fonction signal(). Quel que soit le signal que vous souhaitez capter dans votre programme, vous devez enregistrer ce signal en utilisant signal fonction et associez-la à un gestionnaire de signal. Examinez l'exemple suivant −

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum ) {
   cout << "Interrupt signal (" << signum << ") received.\n";

   // cleanup and close up stuff here  
   // terminate program  

   exit(signum);  
}

int main () {
   // register signal SIGINT and signal handler  
   signal(SIGINT, signalHandler);  

   while(1) {
      cout << "Going to sleep...." << endl;
      sleep(1);
   }

   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant −

Going to sleep....
Going to sleep....
Going to sleep....

Maintenant, appuyez sur Ctrl+c pour interrompre le programme et vous verrez que votre programme captera le signal et sortira en imprimant quelque chose comme suit −

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

La fonction raise()

Vous pouvez générer des signaux par la fonction raise() , qui prend un numéro de signal entier comme argument et a la syntaxe suivante.

int raise (signal sig);

Tiens, signe est le numéro de signal pour envoyer l'un des signaux :SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP. Voici l'exemple où nous élevons un signal en interne en utilisant la fonction raise() comme suit −

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum ) {
   cout << "Interrupt signal (" << signum << ") received.\n";

   // cleanup and close up stuff here  
   // terminate program  

   exit(signum);  
}

int main () {
   int i = 0;
   // register signal SIGINT and signal handler  
   signal(SIGINT, signalHandler);  

   while(++i) {
      cout << "Going to sleep...." << endl;
      if( i == 3 ) {
         raise( SIGINT);
      }
      sleep(1);
   }

   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant et sort automatiquement −

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

Langue C

  1. Types de données C++
  2. Opérateurs C++
  3. Commentaires C++
  4. Modèles de classe C++
  5. Gestion des fichiers C
  6. Gestion des exceptions C++ :essayez, attrapez, lancez Exemple
  7. C - Traitement des erreurs
  8. Présentation de C++
  9. Constantes/littéraux C++