C++ Signaalverwerking
Signalen zijn de onderbrekingen die door het besturingssysteem aan een proces worden geleverd en die een programma voortijdig kunnen beëindigen. U kunt interrupts genereren door op Ctrl+C te drukken op een UNIX-, LINUX-, Mac OS X- of Windows-systeem.
Er zijn signalen die niet door het programma kunnen worden opgevangen, maar er is een lijst met signalen die u in uw programma kunt opvangen en op basis van het signaal passende acties kunt ondernemen. Deze signalen zijn gedefinieerd in het C++ headerbestand
| Zr.Nee | Signaal en beschrijving |
|---|---|
| 1 | SIGABRT Abnormale beëindiging van het programma, zoals een oproep om af te breken . |
| 2 | SIGFPE Een foutieve rekenkundige bewerking, zoals delen door nul of een bewerking die resulteert in overflow. |
| 3 | SIGILL Detectie van een illegale instructie. |
| 4 | SIGINT Ontvangst van een interactief attentiesignaal. |
| 5 | SIGSEGV Een ongeldige toegang tot opslag. |
| 6 | SIGTERM Een beëindigingsverzoek verzonden naar het programma. |
De signaal() Functie
C++ signaalverwerkingsbibliotheek biedt functie signaal onverwachte gebeurtenissen te vangen. Hieronder volgt de syntaxis van de signal()-functie −
void (*signal (int sig, void (*func)(int)))(int);
Om het simpel te houden, ontvangt deze functie twee argumenten:het eerste argument als een geheel getal dat het signaalnummer vertegenwoordigt en het tweede argument als een verwijzing naar de signaalverwerkingsfunctie.
Laten we een eenvoudig C++-programma schrijven waarin we het SIGINT-signaal vangen met de functie signal(). Welk signaal u ook in uw programma wilt opvangen, u moet dat signaal registreren met signaal functie en associeer deze met een signaalbehandelaar. Bekijk het volgende voorbeeld −
#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;
}
Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −
Going to sleep.... Going to sleep.... Going to sleep....
Druk nu op Ctrl+c om het programma te onderbreken en je zult zien dat je programma het signaal zal opvangen en eruit zou komen door iets als volgt af te drukken −
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
De functie raise()
U kunt signalen genereren met de functie raise() , die een geheel getal als argument neemt en de volgende syntaxis heeft.
int raise (signal sig);
Hier, sig is het signaalnummer om een van de signalen te verzenden:SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP. Hieronder volgt het voorbeeld waarin we een signaal intern verhogen met de functie raise() als volgt −
#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;
}
Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op en wordt het automatisch weergegeven −
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
C Taal