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

/* Variable volatile pour la communication avec le gestionnaire de signal */
volatile sig_atomic_t terminer = 0;

/* Gestionnaire de signal pour SIGINT */
void gestionnaire_sigint(int signum) {
    (void)signum;  /* Évite l'avertissement unused parameter */
    terminer = 1;
}

int main(void) {
    int compteur = 0;
    
    /* Installation du gestionnaire pour SIGINT */
    if (signal(SIGINT, gestionnaire_sigint) == SIG_ERR) {
        perror("Erreur lors de l'installation du gestionnaire");
        return EXIT_FAILURE;
    }
    
    printf("=== Programme avec gestion de SIGINT ===\n");
    printf("Appuyez sur Ctrl+C pour terminer proprement la boucle\n");
    printf("Le programme va compter jusqu'à ce que vous envoyiez SIGINT\n\n");
    
    /* Boucle principale qui s'exécute tant que terminer == 0 */
    while (!terminer) {
        printf("Compteur: %d\n", compteur++);
        sleep(1);  /* Pause d'une seconde */
        
        /* Simulation d'un travail long */
        if (compteur > 30 && !terminer) {
            printf("\nTravail long terminé. Sortie normale.\n");
            break;
        }
    }
    
    if (terminer) {
        printf("\n\nSignal SIGINT reçu !\n");
        printf("Nettoyage en cours...\n");
        sleep(1);  /* Simulation d'un nettoyage */
        printf("Programme terminé proprement.\n");
    } else {
        printf("Programme terminé normalement (sans SIGINT).\n");
    }
    
    return EXIT_SUCCESS;
}

Dans gdb , on peut neutraliser l’effet de ctrl+c avec cette commande

handle SIGINT nostop noprint pass