Anda di halaman 1dari 5

C++ el manejo de señales

Las señales son las interrupciones entregados a un proceso por el sistema operativo
que puede terminar un programa prematuramente. Puede generar interrupciones
pulsando Ctrl + C en un sistema UNIX, Linux, Mac OS X o Windows.
Hay señales que no pueden ser capturadas por el programa, pero hay un siguiente
lista de señales que se puede tomar en su programa y puede tomar las acciones
apropiadas basadas en la señal. Estas señales se definen en el archivo de cabecera
C ++ <csignal>.

Señal Descripción

SIGABRT Terminación anormal del programa, tales como una llamada para abortar

SIGFPE Una operación aritmética errónea, tal como una división por cero o una
operación que resulta en desbordamiento.

SIGILL La detección de una instrucción ilegal

SIGINT La recepción de una señal de atención interactiva.

SIGSEGV Un acceso no válido para el almacenamiento.

SIGTERM A petición de terminación enviado al programa.

El () la función de señal:
C ++ biblioteca de manipulación de la señal proporciona señal de función
para atrapar eventos inesperados. A continuación se muestra la sintaxis
de la función de señal ():

void (*signal (int sig, void (*func)(int)))(int);


Hacer que sea sencillo, esta función recibe dos argumentos: en 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 tratamiento de
señal.
Vamos a escribir un simple programa en C ++ donde nos estará esperando
la señal SIGINT usando la función de señal (). Cualquiera que sea la señal
que se desea capturar en su programa, debe registrar esa señal usando la
función de señal y asociarlo 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 el código se compila y ejecuta, se produce el siguiente resultado:

Going to sleep....
Going to sleep....
Going to sleep....

Ahora, pulse Ctrl + C para interrumpir el programa y verá que su programa


se captura la señal y saldría por algo de impresión de la siguiente manera:

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

El () la función de elevación:
Puede generar señales de aumento función (), que tiene un número de
señales entero como un argumento y tiene la siguiente sintaxis.

int raise (signal sig);

Aquí, sig es 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 que elevamos una señal
utilizando internamente aumentar () la función 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 se compila y ejecuta, se produce el siguiente resultado y


saldría de forma automática:

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

Anda mungkin juga menyukai