Namespaces
Variants

signal

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

Cambia el manejo de la señal sig. Dependiendo del valor de handler, la señal puede ser ignorada, establecida al valor por defecto, o manejada por una función definida por el usuario invocada como (*handler)(sig).

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

Parámetros

sig - la señal a la que establecer el manejador de señal. Puede ser un valor definido por la implementación o uno de los siguientes valores:
define los tipos de señal
(constante de macro)
handler - el manejador de señal. Debe ser uno de los siguientes:
  • SIG_DFL macro. El manejador de señal se establece al manejador de señal por defecto.
  • 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ñal puede estar deshabilitado en algunas implementaciones).

Manejador de señal

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

Si la función definida por el usuario retorna al manejar SIGFPE, SIGILL o SIGSEGV, el comportamiento no está definido.

Si el manejador de señal es llamado como resultado de abort o raise, el comportamiento no está definido si el manejador de señal llama a raise.

Si el manejador de señal es llamado NO como resultado de abort o raise (en otras palabras, el manejador de señal es asíncrono), el comportamiento no está definido si

  • el manejador de señal 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 volverse a registrar a sí mismo, pero no otras señales).
  • funciones atómicas de <stdatomic.h> si los argumentos atómicos están libres de bloqueo
  • atomic_is_lock_free (con cualquier tipo de argumentos atómicos)
  • el manejador de señal se refiere a cualquier objeto con duración de almacenamiento estática o local al hilo(desde C11) que no sea una atómica(desde C11) libre de bloqueo, excepto asignando a un volatile sig_atomic_t estático.

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

  • objetos de tipo volatile sig_atomic_t
  • objetos de tipos atómicos libres de bloqueo (desde C11)
  • efectos secundarios hechos visibles a través de atomic_signal_fence (desde C11)

Al retornar de un manejador de señal, el valor de cualquier objeto modificado por el manejador de señal que no sea volatile sig_atomic_t o atómico libre de bloqueo(desde C11) no está definido.

El comportamiento no está definido si signal se usa 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ñal.

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 subespecificado y variaciones significativas de implementación, en cuanto a la entrega de señales mientras se ejecuta un manejador de señal.

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 C23 (ISO/IEC 9899:2024):
  • 7.14.1.1 La función signal (p: 285-286)
  • 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)