En la biblioteca estándar de C , el procesamiento de señales define cómo un programa maneja varias señales mientras se ejecuta. Una señal puede informar algún comportamiento excepcional dentro del programa (como una división por cero ) o puede informar algún evento asincrónico fuera del programa (como cuando alguien presiona una tecla de atención interactiva en un teclado).
El estándar C define solo 6 señales. Todas ellas están definidas en signal.h
el encabezado ( csignal
encabezado en C++ ): [1]
SIGABRT
– “abortar”, terminación anormal.SIGFPE
– excepción de punto flotante .SIGILL
– instrucción "ilegal", inválida.SIGINT
– “interrumpir”, solicitud de atención interactiva enviada al programa.SIGSEGV
– " violación de segmentación ", acceso a memoria no válido.SIGTERM
– "terminar", solicitud de terminación enviada al programa.signal.h
La implementación puede especificar señales adicionales en el encabezado. Por ejemplo, los sistemas operativos Unix y similares (como Linux ) definen más de 15 señales adicionales; consulte Señal Unix . [2]
SIGTRAP
Para fines de depuración. Depende de la plataforma y puede usarse en sistemas operativos tipo Unix .Una señal se puede generar mediante una llamada raise()
o kill()
llamadas al sistema. raise()
envía una señal al proceso actual, kill()
envía una señal a un proceso específico.
Un controlador de señal es una función que el entorno de destino llama cuando se produce la señal correspondiente. El entorno de destino suspende la ejecución del programa hasta que el controlador de señal regresa o llama a longjmp()
.
Los controladores de señales se pueden configurar con signal()
o sigaction()
. El comportamiento de signal()
se ha modificado varias veces a lo largo del historial y se desaconseja su uso. [3] Solo es portátil cuando se utiliza para configurar la disposición de una señal en SIG_DFL o SIG_IGN. Los controladores de señales se pueden especificar para todas las señales excepto dos ( SIGKILL y SIGSTOP no se pueden detectar, bloquear ni ignorar).
Si la señal informa un error dentro del programa (y la señal no es asincrónica), el controlador de señal puede finalizar llamando a abort()
, exit()
o longjmp()
.
#include <señal.h> #include <stdio.h> #include <stdlib.h> estado volátil sig_atomic_t = 0 ; static void catch_function ( int signo ) { estado = signo ; } int main ( void ) { // Establezca la función anterior como controlador de señal para la señal SIGINT: if ( signal ( SIGINT , catch_function ) == SIG_ERR ) { fputs ( "Ocurrió un error al configurar un controlador de señal. \n " , stderr ); return EXIT_FAILURE ; } puts ( "Generando la señal de atención interactiva." ); if ( raise ( SIGINT )) { fputs ( "Error al generar la señal. \n " , stderr ); return EXIT_FAILURE ; } if ( status == SIGINT ) puts ( "Señal de atención interactiva detectada." ); puts ( "Saliendo." ); return EXIT_SUCCESS ; // saliendo después de generar la señal }