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