#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
