// signal.c — instalar un manejador de señales con sigaction().
// Ctrl-C (SIGINT) ya no mata al programa: solo se cuenta.
// SIGTERM pide terminar de forma ordenada. SIGKILL no se puede capturar.
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static volatile sig_atomic_t interrupts = 0;
static volatile sig_atomic_t done = 0;

// En un manejador solo se deben usar operaciones seguras:
// aquí solo se modifican variables de tipo sig_atomic_t.
static void on_int(int sig) {
    (void)sig;
    interrupts++;
}

static void on_term(int sig) {
    (void)sig;
    done = 1;
}

int main(void) {
    struct sigaction sa = {0};
    sigemptyset(&sa.sa_mask);

    sa.sa_handler = on_int;
    sigaction(SIGINT, &sa, NULL);
    sa.sa_handler = on_term;
    sigaction(SIGTERM, &sa, NULL);

    printf("PID %d: prueben Ctrl-C o kill -TERM %d\n", getpid(), getpid());
    fflush(stdout);

    int seen = 0;
    while (!done) {
        pause();                    // dormir hasta que llegue una señal
        if (interrupts != seen) {
            seen = interrupts;
            printf("SIGINT número %d: lo ignoro\n", seen);
            fflush(stdout);
        }
    }
    printf("SIGTERM: termino ordenadamente tras %d SIGINT\n", seen);
    return 0;
}
