C Biblioteca estándar -<signal.h>

Introducción

<signal.h>Es un archivo de cabecera en la biblioteca estándar de C, utilizado para manejar señales.

signal.hEl archivo de cabecera define un tipo de variablesig_atomic_t, dos llamadas a funciones y algunas macros para manejar las diferentes señales reportadas durante la ejecución del programa.

Las señales son un mecanismo de notificación asíncrona que permite a un proceso ejecutar funciones de manejo predefinidas cuando ocurren eventos específicos.

A continuación se muestra un programa de ejemplo simple que demuestra cómo usar la función signal para capturar la señal SIGINT (generalmente generada por Ctrl+C).

Ejemplo

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

// Variable global que indica si el programa debe salir
volatile sig_atomic_t stop = 0;

void handle_sigint(int sig) {
    printf("Caught signal %d\n", sig);
    stop = 1; // Establecer el indicador de salida
}

int main() {
    // Establecer el manejador de la señal SIGINT como la función handle_sigint
    signal(SIGINT, handle_sigint);

    while (!stop) { // Verificar si debe salir
        printf("Running...\n");
        sleep(1);
    }

    printf("Exiting...\n");

    return 0;
}

En el código anterior, cuando el programa se está ejecutando, si el usuario presionaCtrl+C, se capturará la señal SIGINT y se llamará a la función handle_sigint, imprimiendo el número de señal.

Compile y ejecute el código anterior, el resultado de salida es el siguiente:

Running...
Running...
Running...
^CCaught signal 2
Exiting...

Análisis del código:

  • volatile sig_atomic_t stop = 0;Definir una variable globalstop, utilizada para indicar si el programa debe salir. Usarvolatilela palabra clave garantiza que el compilador no optimice el acceso a esta variable, porque puede ser modificada en el manejador de señales.sig_atomic_tEl tipo garantiza que el acceso a esta variable sea atómico.
  • Enhandle_sigintEn la función de manejo de señales, se establecestopa 1, indicando que el programa debe salir.
  • En el bucle principal, se verificastopel valor de la variable; si está establecida en 1, se sale del bucle y se termina el programa.

Variables de biblioteca

A continuación se muestran los tipos de variables definidos en el archivo de cabecera signal.h:

N.ºVariable y descripción
1sig_atomic_t
Este es elinttipo, utilizado como variable en los manejadores de señales. Es un tipo entero de un objeto que puede ser accedido como una entidad atómica, incluso en presencia de señales asíncronas.
2sigset_t
Un tipo de dato utilizado para representar un conjunto de señales.

Macros de biblioteca

<

En la biblioteca estándar de C,SIG_las macros con prefijo se usan junto consignallas funciones, para definir y manejar el comportamiento de las señales. A continuación se presentan las macrosSIG_comunes y sus usos:

N.ºMacro y descripción
1 SIG_DFL
Representa el manejador predeterminado de la señal. Use esta macro para restaurar la señal a su comportamiento predeterminado.
2 SIG_ERR
Representa el valor de retorno cuando se produce un error al configurar la función de manejo de señales.
3 SIG_IGN
Ignorar la señal.

Tipos de señal:

ConstanteDescripción
SIGABRTRazónabortSeñal generada por la función, indica terminación anormal
SIGALRMRazónalarmSeñal de vencimiento del temporizador establecido por la función
SIGBUSAcceso a memoria no válido (por ejemplo, acceso a una dirección de memoria no alineada)
SIGCHLDCambio de estado de un proceso hijo (salida o detención)
SIGCONTContinuar la ejecución de un proceso suspendido
SIGFPEError aritmético (por ejemplo, división por cero, excepción de punto flotante)
SIGHUPSeñal de cuelgue (generalmente utilizada para detectar la desconexión del terminal)
SIGILLInstrucción ilegal
SIGINTSeñal de interrupción (generalmente generada por Ctrl+C)
SIGKILLSeñal de terminación inmediata (no puede ser capturada ni ignorada)
SIGPIPEEscribir datos en una tubería sin proceso lector
SIGQUITSeñal de salida del terminal (generalmente generada por Ctrl+\), genera un volcado de núcleo
SIGSEGVError de segmentación (acceso a memoria no válido)
SIGSTOPDetener la ejecución del proceso (no puede ser capturada ni ignorada)
SIGTERMSeñal de terminación
SIGTSTPSuspender el proceso (generalmente generado por Ctrl+Z)
SIGTTINSeñal generada cuando un proceso en segundo plano lee datos desde el terminal
SIGTTOUSeñal generada cuando un proceso en segundo plano escribe datos en el terminal
SIGUSR1Señal personalizada del usuario 1
SIGUSR2Señal personalizada del usuario 2
SIGPOLLEvento de E/S (reemplaza a SIGIO)
SIGPROFSeñal de vencimiento del temporizador (temporizador de perfiladosetitimerestablecido por)
SIGSYSLlamada al sistema ilegal
SIGTRAPInstrucción de punto de interrupción o trampa
SIGURGSeñal de condición urgente de socket
SIGVTALRMSeñal de vencimiento del temporizador de reloj virtual
SIGXCPUSe excede el límite de tiempo de CPU
SIGXFSZSe excede el límite de tamaño de archivo

Funciones de biblioteca

A continuación se muestran las funciones definidas en el archivo de cabecera signal.h:

Función Descripción
void (*signal(int sig, void (*func)(int)))(int); Establece el manejador de señales.
int raise(int sig); Envía una señal al proceso actual.
int kill(pid_t pid, int sig); Envía una señal al proceso especificado.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); Verifica o cambia el conjunto de señales bloqueadas.
int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact); Verifica o cambia el manejador de señales.
int sigsuspend(const sigset_t *mask); Reemplaza temporalmente la máscara de señales actual y suspende el proceso hasta que se capture una señal.
int sigpending(sigset_t *set); Verifica el conjunto de señales pendientes.
int sigemptyset(sigset_t *set); Inicializa el conjunto de señales como un conjunto vacío.
int sigfillset(sigset_t *set); Inicializa el conjunto de señales como el conjunto completo de señales.
int sigaddset(sigset_t *set, int signum); Agrega la señal especificada al conjunto de señales.
int sigdelset(sigset_t *set, int signum); Elimina la señal especificada del conjunto de señales.
int sigismember(const sigset_t *set, int signum); Verifica si la señal especificada está en el conjunto de señales.
void abort(void); GeneraSIGABRTuna señal, causando la terminación anormal del proceso.
unsigned int alarm(unsigned int seconds); Envía laSIGALRMseñal al proceso que llama después del número de segundos especificado.
int pause(void); Suspende el proceso hasta que se capture una señal.
void psignal(int sig, const char *s); Imprime información de descripción de la señal.
char *strsignal(int sig); Devuelve la cadena de descripción de la señal.
int sigwait(const sigset_t *set, int *sig); Espera bloqueando señales y las procesa.
Otras extensiones