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 <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.- En
handle_sigintEn la función de manejo de señales, se establecestopa 1, indicando que el programa debe salir. - En el bucle principal, se verifica
stopel 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 |
|---|---|
| 1 | sig_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. |
| 2 | sigset_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:
| Constante | Descripción |
|---|---|
SIGABRT | RazónabortSeñal generada por la función, indica terminación anormal |
SIGALRM | RazónalarmSeñal de vencimiento del temporizador establecido por la función |
SIGBUS | Acceso a memoria no válido (por ejemplo, acceso a una dirección de memoria no alineada) |
SIGCHLD | Cambio de estado de un proceso hijo (salida o detención) |
SIGCONT | Continuar la ejecución de un proceso suspendido |
SIGFPE | Error aritmético (por ejemplo, división por cero, excepción de punto flotante) |
SIGHUP | Señal de cuelgue (generalmente utilizada para detectar la desconexión del terminal) |
SIGILL | Instrucción ilegal |
SIGINT | Señal de interrupción (generalmente generada por Ctrl+C) |
SIGKILL | Señal de terminación inmediata (no puede ser capturada ni ignorada) |
SIGPIPE | Escribir datos en una tubería sin proceso lector |
SIGQUIT | Señal de salida del terminal (generalmente generada por Ctrl+\), genera un volcado de núcleo |
SIGSEGV | Error de segmentación (acceso a memoria no válido) |
SIGSTOP | Detener la ejecución del proceso (no puede ser capturada ni ignorada) |
SIGTERM | Señal de terminación |
SIGTSTP | Suspender el proceso (generalmente generado por Ctrl+Z) |
SIGTTIN | Señal generada cuando un proceso en segundo plano lee datos desde el terminal |
SIGTTOU | Señal generada cuando un proceso en segundo plano escribe datos en el terminal |
SIGUSR1 | Señal personalizada del usuario 1 |
SIGUSR2 | Señal personalizada del usuario 2 |
SIGPOLL | Evento de E/S (reemplaza a SIGIO) |
SIGPROF | Señal de vencimiento del temporizador (temporizador de perfiladosetitimerestablecido por) |
SIGSYS | Llamada al sistema ilegal |
SIGTRAP | Instrucción de punto de interrupción o trampa |
SIGURG | Señal de condición urgente de socket |
SIGVTALRM | Señal de vencimiento del temporizador de reloj virtual |
SIGXCPU | Se excede el límite de tiempo de CPU |
SIGXFSZ | Se 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. |