Manejo de señales C++
Las señales son las interrupciones entregadas a un proceso por el sistema operativo que pueden terminar un programa prematuramente. Puede generar interrupciones presionando Ctrl+C en un sistema UNIX, LINUX, Mac OS X o Windows.
Hay señales que no pueden ser captadas por el programa, pero hay una lista siguiente de señales que puede captar en su programa y puede tomar las medidas apropiadas en función de la señal. Estas señales se definen en el archivo de encabezado de C++
| Sr.No | Señal y descripción |
|---|---|
| 1 | SIGABRT Terminación anormal del programa, como una llamada a abortar . |
| 2 | SIGFPE Una operación aritmética errónea, como una división por cero o una operación que resulte en un desbordamiento. |
| 3 | SIGILO Detección de una instrucción ilegal. |
| 4 | FIRMA Recepción de una señal de atención interactiva. |
| 5 | SIGSEGV Un acceso no válido al almacenamiento. |
| 6 | SIGTERM Una solicitud de terminación enviada al programa. |
La función señal()
La biblioteca de manejo de señales de C++ proporciona la función señal para atrapar eventos inesperados. La siguiente es la sintaxis de la función signal() −
void (*signal (int sig, void (*func)(int)))(int);
Manteniéndolo simple, esta función recibe dos argumentos:el primer argumento como un número entero que representa el número de la señal y el segundo argumento como un puntero a la función de manejo de la señal.
Escribamos un programa simple en C++ donde capturaremos la señal SIGINT usando la función signal(). Independientemente de la señal que desee capturar en su programa, debe registrar esa señal usando signal función y asociarlo con un controlador de señal. Examine el siguiente ejemplo −
#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;
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado −
Going to sleep.... Going to sleep.... Going to sleep....
Ahora, presione Ctrl+c para interrumpir el programa y verá que su programa captará la señal y saldrá imprimiendo algo de la siguiente manera −
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
La función aumentar()
Puede generar señales mediante la función raise() , que toma un número de señal entero como argumento y tiene la siguiente sintaxis.
int raise (signal sig);
Toma, firma es el número de señal para enviar cualquiera de las señales:SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP. El siguiente es el ejemplo en el que elevamos una señal internamente usando la función raise() de la siguiente manera −
#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;
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado y saldría automáticamente −
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
Lenguaje C