web-dev-qa-db-fra.com

Comment puis-je attraper un événement ctrl-c?

Comment puis-je attraper un Ctrl+C événement en C++?

122
Scott

signal n'est pas le moyen le plus fiable car il diffère dans les implémentations. Je recommanderais d'utiliser sigaction. Le code de Tom ressemblerait maintenant à ceci:

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

void my_handler(int s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{

   struct sigaction sigIntHandler;

   sigIntHandler.sa_handler = my_handler;
   sigemptyset(&sigIntHandler.sa_mask);
   sigIntHandler.sa_flags = 0;

   sigaction(SIGINT, &sigIntHandler, NULL);

   pause();

   return 0;    
}
160
Gab Royer

Pour une application de console Windows, vous souhaitez utiliser SetConsoleCtrlHandler pour gérer CTRL+C et CTRL+BREAK.

Voir ici pour un exemple.

48
Chris Smith

Vous devez attraper le SIGINT signal (nous parlons de POSIX, n'est-ce pas?)

Voir la réponse de @Gab Royer pour la sigaction.

Exemple:

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

void my_handler(sig_t s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{
   signal (SIGINT,my_handler);

   while(1);
   return 0;

}
32
Tom

Oui, c'est une question dépendante de la plateforme.

Si vous écrivez un programme console sur POSIX, utilisez l’API du signal (#include <signal.h>).

Dans une application graphique WIN32, vous devez gérer le message WM_KEYDOWN.

1
Joyer