Señales en C
Un handler corre al interrumpir, y solo puede tocar cosas async-signal-safe.
#define _POSIX_C_SOURCE 200809L
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
static volatile sig_atomic_t stop_requested = 0;
static void on_signal(int signum) {
(void) signum;
stop_requested = 1;
}
int main(void) {
struct sigaction action;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
action.sa_handler = on_signal;
if (sigaction(SIGINT, &action, NULL) != 0) {
perror("sigaction");
return 1;
}
printf("working, press ctrl-c\n");
for (int i = 0; i < 5 && !stop_requested; i++) {
sleep(1);
}
printf("stopped %s\n", stop_requested ? "early" : "normally");
return 0;
}
Cómo funciona
sigactiones POSIX, así que la macro de features va primero.- El flag que activa debe ser
volatile sig_atomic_t. - Haz el trabajo real de vuelta en el bucle principal, no en el handler.
Palabras clave y builtins usados aquí
NULLforifintreturnsig_atomic_tstaticstructvoidvolatile
El intento, en números
- Líneas
- 31
- Caracteres a escribir
- 591
- Tokens
- 149
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 85 segundos.
Paso 4 de 4 en Procesos y señales; paso 10 de 14 en Programación de sistemas.