Manejo de señales en C++

Las señales son las interrupciones que obligan a un sistema operativo a detener su tarea en curso y atender la tarea para la que se envió la interrupción. Estas interrupciones pueden pausar el servicio en cualquier programa de un sistema operativo. De manera similar, C++ también ofrece varias señales que puede capturar y procesar en un programa. Aquí hay una lista de varias señales y sus operaciones que C++ proporciona al usuario para trabajar.

Señales

Operaciones

SEGUIR

produce un recibo para una señal activa

SIGTERM

Envía una solicitud de terminación al programa

SIGBUS

Error de bus que indica acceso a una dirección no válida

SEÑAL

Detecta un comando ilegal

SIGALRM

Esto es utilizado por la función alarm() e indica la expiración del temporizador.

SIGABRT

Terminación de un programa, anormalmente

SEGUIMIENTO

La señal no puede ser bloqueada, manipulada e ignorada y puede detener un proceso

SIGSEGV

Acceso no válido al almacenamiento

SIGFPE

Operaciones de desbordamiento u operaciones matemáticamente incorrectas como dividir por cero

SIGUSR1

SIGSUR2

Señales definidas por el usuario

Esta función signal() es proporcionada por la biblioteca de señales y se usa para atrapar interrupciones o eventos inesperados. 

Sintaxis:

signal(registered signal, signal handler)

El primer argumento es un número entero, que representa el número de señal y el segundo es el puntero a una función de manejo de señal. Debemos tener en cuenta que la señal que queremos captar debe estar registrada mediante una función de señal y debe estar asociada a una función de manejo de señal. La función de manejo de señales debe ser del tipo vacío. 

Ejemplo:  

CPP

// CPP Program to demonstrate the signal() function
#include <csignal>
#include <iostream>
using namespace std;
  
void signal_handler(int signal_num)
{
    cout << "The interrupt signal is (" << signal_num
         << "). \n";
  
    // It terminates the  program
    exit(signal_num);
}
  
int main()
{
    // register signal SIGABRT and signal handler
    signal(SIGABRT, signal_handler);
  
    while (true)
        cout << "Hello GeeksforGeeks..." << endl;
    return 0;
}

Salida: al estar en un ciclo infinito, este código mostrará la siguiente salida hasta que se enfrente una interrupción:  

Hello GeeksforGeeks...
Hello GeeksforGeeks...
Hello GeeksforGeeks...
Hello GeeksforGeeks...

Ahora si presionamos Ctrl+C para enviar una interrupción, el programa saldrá imprimiendo:  

Hello GeeksforGeeks...
Hello GeeksforGeeks...
Hello GeeksforGeeks...
Hello GeeksforGeeks...
The interrupt signal is (22).

función aumentar()

La función raise() se utiliza para generar señales. 

Sintaxis:

raise( signal )

Toma un argumento como cualquiera de las funciones mencionadas en la lista. 

Ejemplo: 

CPP

// CPP Program to demonstrate the raise() function
#include <csignal>
#include <iostream>
  
using namespace std;
  
void signal_handler(int signal_num)
{
    cout << "Interrupt signal is (" << signal_num << ").\n";
  
    // It terminates program
    exit(signal_num);
}
  
int main()
{
    int count = 0;
    signal(SIGSEGV, signal_handler);
    // register signal SIGSEGV and signal handler
  
    while (++count) {
        cout << "Hello GeeksforGeeks..." << endl;
        if (count == 5)
            raise(SIGSEGV);
    }
    return 0;
}
Producción

Hello GeeksforGeeks...
Hello GeeksforGeeks...
Hello GeeksforGeeks...
Hello GeeksforGeeks...
Hello GeeksforGeeks...
Interrupt signal is (11).

Este artículo es una contribución de Chinmoy Lenka . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Categories C++

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *