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 reportar algún comportamiento excepcional dentro del programa ( como una división por cero ), o una señal puede reportar algún evento asincrónico fuera del programa ( como alguien que presiona una tecla de atención interactiva en un teclado ).
Señales estándar
El estándar C define solo 6 señales. Todos están definidos en el signal.h
encabezado ( csignal
encabezado en C ++ ): [1]
SIGABRT
- "abortar", terminación anormal.SIGFPE
- f loating p oint e Xception .SIGILL
- "ilegal", instrucción inválida.SIGINT
- "interrupción", solicitud de atención interactiva enviada al programa.SIGSEGV
- " seg mentación v iolation ", acceso a memoria no válida.SIGTERM
- "terminar", solicitud de terminación enviada al programa.
La signal.h
implementación puede especificar señales adicionales en el encabezado. Por ejemplo, los sistemas operativos Unix y similares a Unix (como Linux ) definen más de 15 señales adicionales; ver señal Unix . [2]
Depuración
Manejo
Se puede generar una señal mediante llamadas 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 manejador de señales es una función a la que llama el entorno de destino cuando se produce la señal correspondiente. El entorno de destino suspende la ejecución del programa hasta que el manejador de señales regresa o llama longjmp()
.
Los manejadores de señales se pueden configurar con signal()
o sigaction()
. El comportamiento de signal()
ha cambiado varias veces a lo largo de la historia y ahora se considera obsoleto. [3] Solo es portátil cuando se utiliza para establecer la disposición de una señal en SIG_DFL o SIG_IGN. Los manejadores de señales se pueden especificar para todas las señales excepto dos ( SIGKILL y SIGSTOP no se pueden capturar, bloquear o ignorar).
Si la señal informa de un error en el programa (y la señal no es asíncrono), el manejador de la señal puede terminar llamando abort()
, exit()
o longjmp()
.
Funciones
Función | Descripción |
---|---|
raise | envía artificialmente una señal al proceso de llamada |
kill | envía artificialmente una señal a un proceso específico |
signal | establece la acción tomada cuando el programa recibe una señal específica |
Uso de ejemplo
#include ñal.h>#include #include estática vacío catch_function ( int signo ) { puts ( "señal de atención interactivo atrapado." ); }int main ( void ) { // Establecer la función anterior como manejador de señales para la señal SIGINT: if ( signal ( SIGINT , catch_function ) == SIG_ERR ) { fputs ( "Ocurrió un error al configurar un manejador de señales. \ n " , stderr ) ; return EXIT_FAILURE ; } put ( "Elevando la señal de atención interactiva." ); if ( raise ( SIGINT ) ! = 0 ) { fputs ( "Error al subir la señal. \ n " , stderr ); return EXIT_FAILURE ; } put ( "Saliendo" ); return EXIT_SUCCESS ; // saliendo después de subir la señal }
Ver también
Referencias
- ^ Especificación ISO / IEC 9899: 1999 (PDF) . pag. 258, § 7.14 Manejo de señales .
- ^ "Las especificaciones de la base de grupo abierto Edición 6 - signal.h - señales" . Consultado el 10 de enero de 2012 .
- ^ http://man7.org/linux/man-pages/man2/signal.2.html Página de manual de Signal (2)