Gestione del segnale C ++

I segnali sono le interruzioni fornite a un processo dal sistema operativo che può terminare prematuramente un programma. Puoi generare interruzioni premendo Ctrl + C su un sistema UNIX, LINUX, Mac OS X o Windows.

Ci sono segnali che non possono essere catturati dal programma, ma c'è un seguente elenco di segnali che puoi catturare nel tuo programma e possono intraprendere azioni appropriate in base al segnale. Questi segnali sono definiti nel file di intestazione C ++ <csignal>.

Suor n Segnale e descrizione
1

SIGABRT

Interruzione anomala del programma, come una chiamata a abort.

2

SIGFPE

Un'operazione aritmetica errata, come una divisione per zero o un'operazione che ha come risultato un overflow.

3

SIGILL

Rilevamento di un'istruzione illegale.

4

SIGINT

Ricezione di un segnale di attenzione interattivo.

5

SIGSEGV

Un accesso non valido allo spazio di archiviazione.

6

SIGTERM

Una richiesta di interruzione inviata al programma.

La funzione signal ()

La libreria di gestione dei segnali C ++ fornisce funzioni signalper intrappolare eventi inaspettati. Di seguito è riportata la sintassi della funzione signal ():

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

Per semplificare, questa funzione riceve due argomenti: il primo argomento come numero intero che rappresenta il numero di segnale e il secondo argomento come puntatore alla funzione di gestione del segnale.

Scriviamo un semplice programma C ++ in cui cattureremo il segnale SIGINT usando la funzione signal (). Qualunque segnale tu voglia catturare nel tuo programma, devi registrarlo usandosignalfunzione e associarlo a un gestore di segnali. Esamina il seguente esempio:

#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;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

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

Ora, premi Ctrl + c per interrompere il programma e vedrai che il tuo programma catturerà il segnale e uscirà stampando qualcosa come segue:

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

La funzione raise ()

Puoi generare segnali in base alla funzione raise(), che accetta un numero di segnale intero come argomento e ha la seguente sintassi.

int raise (signal sig);

Qui, sigè il numero del segnale per inviare uno qualsiasi dei segnali: SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP. Di seguito è riportato l'esempio in cui alziamo un segnale internamente usando la funzione raise () come segue:

#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;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato e verrà visualizzato automaticamente:

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