C++-Signalverarbeitung
Signale sind die vom Betriebssystem an einen Prozess gelieferten Interrupts, die ein Programm vorzeitig beenden können. Sie können Interrupts generieren, indem Sie auf einem UNIX-, LINUX-, Mac OS X- oder Windows-System Strg+C drücken.
Es gibt Signale, die vom Programm nicht abgefangen werden können, aber es gibt eine folgende Liste von Signalen, die Sie in Ihrem Programm abfangen und basierend auf dem Signal entsprechende Maßnahmen ergreifen können. Diese Signale sind in der C++-Header-Datei
Sr.No | Signal &Beschreibung |
---|---|
1 | SIGABRT Abnormale Beendigung des Programms, wie z. B. ein Aufruf zum abort . |
2 | SIGFPE Eine fehlerhafte arithmetische Operation, wie z. B. eine Division durch Null oder eine Operation, die zu einem Überlauf führt. |
3 | Siegel Erkennung einer illegalen Anweisung. |
4 | SIGNAL Empfang eines interaktiven Aufmerksamkeitssignals. |
5 | SIGSEGV Ein ungültiger Zugriff auf den Speicher. |
6 | SIGTERM Eine an das Programm gesendete Beendigungsanforderung. |
Die signal()-Funktion
Die C++-Signalverarbeitungsbibliothek stellt die Funktion signal bereit um unerwartete Ereignisse abzufangen. Es folgt die Syntax der Funktion signal() −
void (*signal (int sig, void (*func)(int)))(int);
Um es einfach zu halten, erhält diese Funktion zwei Argumente:das erste Argument als Ganzzahl, die die Signalnummer darstellt, und das zweite Argument als Zeiger auf die Signalverarbeitungsfunktion.
Lassen Sie uns ein einfaches C++-Programm schreiben, in dem wir das SIGINT-Signal mit der Funktion signal() abfangen. Welches Signal Sie auch immer in Ihrem Programm abfangen möchten, Sie müssen dieses Signal mit Signal registrieren -Funktion und verknüpfen Sie sie mit einem Signal-Handler. Untersuchen Sie das folgende Beispiel −
#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; }
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis −
Going to sleep.... Going to sleep.... Going to sleep....
Drücken Sie jetzt Strg+c, um das Programm zu unterbrechen, und Sie werden sehen, dass Ihr Programm das Signal abfangen und etwas wie folgt ausgeben würde −
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
Die Funktion raise()
Sie können Signale mit der Funktion raise() erzeugen , das eine ganzzahlige Signalnummer als Argument akzeptiert und die folgende Syntax hat.
int raise (signal sig);
Hier, unterschreiben ist die Signalnummer, um eines der Signale zu senden:SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP. Im Folgenden sehen Sie ein Beispiel, in dem wir ein Signal intern mit der Funktion raise() wie folgt erhöhen:−
#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; }
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis und würde automatisch herauskommen −
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
C Sprache