typestar

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

  1. sigaction es POSIX, así que la macro de features va primero.
  2. El flag que activa debe ser volatile sig_atomic_t.
  3. Haz el trabajo real de vuelta en el bucle principal, no en el handler.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 4 de 4 en Procesos y señales; paso 10 de 14 en Programación de sistemas.

← Anterior Siguiente →