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