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++
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