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 el programa no puede captar, pero hay una lista siguiente de señales que puede captar en su programa y puede tomar las acciones adecuadas en función de la señal. Estas señales se definen en el archivo de encabezado de C ++ <csignal>.

No Señor Señal y descripción
1

SIGABRT

Terminación anormal del programa, como una llamada a abort.

2

SIGFPE

Una operación aritmética errónea, como una división por cero o una operación que produce un desbordamiento.

3

SIGILL

Detección de una instrucción ilegal.

4

SIGINT

Recepción de una señal de atención interactiva.

5

SIGSEGV

Un acceso inválido al almacenamiento.

6

SIGTERM

Una solicitud de terminación enviada al programa.

La función signal ()

La biblioteca de manejo de señales de C ++ proporciona función signalpara atrapar eventos inesperados. A continuación se muestra 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 (). Cualquiera que sea la señal que desee captar en su programa, debe registrar esa señal utilizandosignalfunción y asóciela con un manejador de señales. 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 se compila y ejecuta el código anterior, 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 raise ()

Puedes generar señales por función raise(), que toma un número de señal entero como argumento y tiene la siguiente sintaxis.

int raise (signal sig);

Aquí, siges el número de señal para enviar cualquiera de las señales: SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP. A continuación se muestra el ejemplo en el que generamos 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á automáticamente:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.