Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

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

  1. Tipos de datos de C++
  2. Operadores de C++
  3. Comentarios de C++
  4. Plantillas de clase de C++
  5. Manejo de archivos C
  6. Manejo de excepciones de C++:ejemplo Try, Catch, throw
  7. C - Manejo de errores
  8. Descripción general de C++
  9. Constantes/Literales de C++
  10. Operadores en C++
  11. Números en C++