Namespaces
Variants

signal

From cppreference.net
Definido en el encabezado <signal.h>
void ( * signal ( int sig, void ( * handler ) ( int ) ) ) ( int ) ;

Establece el manejador de errores para la señal sig . El manejador de señales puede configurarse para que ocurra el manejo predeterminado, se ignore la señal, o se llame a una función definida por el usuario.

Cuando el manejador de señales está configurado a una función y ocurre una señal, está definido por la implementación si signal ( sig, SIG_DFL ) será ejecutado inmediatamente antes del inicio del manejador de señales. Además, la implementación puede prevenir que ocurra algún conjunto definido por la implementación de señales mientras el manejador de señales se ejecuta.

Contenidos

Parámetros

sig - la señal para establecer el manejador de señales. Puede ser un valor definido por la implementación o uno de los siguientes valores:
define tipos de señal
(macro constante)
handler - el manejador de señales. Debe ser uno de los siguientes:
  • SIG_DFL macro. El manejador de señales se establece al manejador de señales predeterminado.
  • SIG_IGN macro. La señal es ignorada.
  • puntero a una función. La firma de la función debe ser equivalente a la siguiente:
void fun ( int sig ) ;

Valor de retorno

Manejador de señal anterior en caso de éxito o SIG_ERR en caso de fallo (establecer un manejador de señales puede estar deshabilitado en algunas implementaciones).

Manejador de señales

Las siguientes limitaciones se imponen a la función definida por el usuario que se instala como un manejador de señales.

Si la función definida por el usuario retorna al manejar SIGFPE , SIGILL o SIGSEGV , el comportamiento es indefinido.

Si el manejador de señales es llamado como resultado de abort o raise , el comportamiento es indefinido si el manejador de señales llama a raise .

Si el manejador de señales es llamado NO como resultado de abort o raise (en otras palabras, el manejador de señales es asíncrono ), el comportamiento es indefinido si

  • el manejador de señales llama a cualquier función dentro de la biblioteca estándar, excepto
  • abort
  • _Exit
  • quick_exit
  • signal con el primer argumento siendo el número de la señal actualmente manejada (el manejador asíncrono puede volver a registrarse a sí mismo, pero no otras señales).
  • funciones atómicas de <stdatomic.h> si los argumentos atómicos son libres de bloqueo
  • atomic_is_lock_free (con cualquier tipo de argumentos atómicos)
  • el manejador de señales se refiere a cualquier objeto con duración de almacenamiento estática o local-de-hilo (desde C11) storage duration que no sea un atomic lock-free (desde C11) que no sea mediante asignación a un volatile sig_atomic_t estático.

Al ingresar al manejador de señales, el estado del entorno de punto flotante y los valores de todos los objetos no están especificados, excepto por

Al regresar de un manejador de señales, el valor de cualquier objeto modificado por el manejador de señales que no sea volatile sig_atomic_t o atómico sin bloqueo (desde C11) es indefinido.

El comportamiento es indefinido si signal se utiliza en un programa multihilo. No se requiere que sea seguro para hilos.

Notas

POSIX requiere que signal sea seguro para hilos, y especifica una lista de funciones de biblioteca seguras para señales asíncronas que pueden ser llamadas desde cualquier manejador de señales.

Además de abort y raise , POSIX especifica que kill , pthread_kill , y sigqueue generan señales síncronas.

POSIX recomienda sigaction en lugar de signal , debido a su comportamiento insuficientemente especificado y variaciones significativas de implementación, con respecto a la entrega de señales mientras se ejecuta un manejador de señales.

Ejemplo

#include <signal.h>
#include <stdio.h>
volatile sig_atomic_t gSignalStatus;
void signal_handler(int signal)
{
  gSignalStatus = signal;
}
int main(void)
{
  signal(SIGINT, signal_handler);
  printf("SignalValue: %d\n", gSignalStatus);
  printf("Sending signal: %d\n", SIGINT);
  raise(SIGINT);
  printf("SignalValue: %d\n", gSignalStatus);
}

Salida:

SignalValue: 0
Sending signal: 2
SignalValue: 2

Referencias

  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.14.1.1 La función signal (p: 193-194)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.14.1.1 La función signal (p: 266-267)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.14.1.1 La función signal (p: 247-248)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.7.1.1 La función signal

Véase también

ejecuta el manejador de señal para una señal particular
(función)