stringtranslate.com

Manejo de señal C

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).

Señales estándar

El estándar C define solo 6 señales. Todas ellas están definidas en signal.hel encabezado ( csignalencabezado en C++ ): [1]

signal.hLa 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]

Depuración

Manejo

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().

Funciones

Ejemplo de uso

#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 }                                

Véase también

Referencias

  1. ^ Especificación ISO/IEC 9899:1999 (PDF) . p. 258, § 7.14 Manejo de señales .
  2. ^ "Especificaciones básicas de The Open Group, número 6 – signal.h – señales" . Consultado el 10 de enero de 2012 .
  3. ^ https://man7.org/linux/man-pages/man2/signal.2.html Página de manual de Signal(2)