appeler une fonction lorsque le programme est terminé avec ctrl c

Je travaille dans l’environnement Linux, et j’ai un programme C ++, ce que je veux, c’est quand j’annule le programme avec ctrl + c, je voudrais que le programme exécute une fonction, ferme des fichiers et imprime un peu de sutff. façon de faire cela? Je vous remercie.

signal() peut être dangereux sur certains OS et est déconseillé sous Linux en faveur de sigaction() . “signal versus sigaction”

Voici un exemple que j’ai rencontré récemment ( “Appuyez sur le signal d’interruption” ) et modifié au fur et à mesure que je jouais avec.

 #include #include #include #include struct sigaction old_action; void sigint_handler(int sig_no) { printf("CTRL-C pressed\n"); sigaction(SIGINT, &old_action, NULL); kill(0, SIGINT); } int main() { struct sigaction action; memset(&action, 0, sizeof(action)); action.sa_handler = &sigint_handler; sigaction(SIGINT, &action, &old_action); pause(); return 0; } 

Pour un exemple de travail complet, vous pouvez essayer le code suivant:

 #include  #include  #include  volatile bool STOP = false; void sigint_handler(int sig); int main() { signal(SIGINT, sigint_handler); while(true) { if (STOP) { break; } } return 0; } void sigint_handler(int sig) { printf("\nCTRL-C detected\n"); STOP = true; } 

Exemple d’exécution:

 [user@host]$ ./a.out ^C CTRL-C detected 

Vous devez attraper le SIGINT. Quelque chose comme ça:

 void sigint_handler(int sig) { [do some cleanup] signal(SIGINT, SIG_DFL); kill(getpid(), SIGINT); } 

charge plus de détails ici

Réponse courte: examinez la fonction de signal, en attrapant spécifiquement SIGINT. Vous écrivez une fonction de rappel et la transmettez au système via la fonction de signal, puis lorsque ce signal se produit, le système appelle votre fonction de rappel. Vous pouvez fermer des fichiers et faire tout ce que vous voulez dans le nettoyage.

Note aux personnes qui pourraient trébucher sur cette question, à la recherche de la réponse dans Windows à la place:

Utilisez l’ SetConsoleCtrlHandler API SetConsoleCtrlHandler pour définir un gestionnaire personnalisé et recherchez CTRL_C_EVENT , CTRL_BREAK_EVENT ou CTRL_CLOSE_EVENT .