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.