Gestion du signal C ++
Les signaux sont les interruptions délivrées à un processus par le système d'exploitation qui peuvent mettre fin prématurément à un programme. Vous pouvez générer des interruptions en appuyant sur Ctrl + C sur un système UNIX, LINUX, Mac OS X ou Windows.
Il existe des signaux qui ne peuvent pas être captés par le programme, mais il existe une liste suivante de signaux que vous pouvez capturer dans votre programme et prendre les mesures appropriées en fonction du signal. Ces signaux sont définis dans le fichier d'en-tête C ++ <csignal>.
Sr.Non | Signal et description |
---|---|
1 | SIGABRT Arrêt anormal du programme, tel qu'un appel à abort. |
2 | SIGFPE Une opération arithmétique erronée, telle qu'une division par zéro ou une opération entraînant un débordement. |
3 | SIGILL Détection d'une instruction illégale. |
4 | SIGINT Réception d'un signal d'attention interactif. |
5 | SIGSEGV Un accès non valide au stockage. |
6 | SIGTERM Une demande de résiliation envoyée au programme. |
La fonction signal ()
La bibliothèque de gestion de signaux C ++ fournit la fonction signalpour piéger les événements inattendus. Voici la syntaxe de la fonction signal () -
void (*signal (int sig, void (*func)(int)))(int);
Pour rester 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 comme un pointeur vers la fonction de gestion du signal.
Écrivons un simple programme C ++ où nous attraperons le signal SIGINT en utilisant la fonction signal (). Quel que soit le signal que vous souhaitez capturer dans votre programme, vous devez enregistrer ce signal en utilisantsignalfonction et associez-le à un gestionnaire de signaux. 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 rise ()
Vous pouvez générer des signaux par fonction raise(), qui prend un nombre de signal entier comme argument et a la syntaxe suivante.
int raise (signal sig);
Ici, sigest 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 rise () 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 sortira automatiquement -
Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.