Comment puis-je intercepter un événement Ctrl + C en C++?Comment puis-je attraper un événement ctrl-c? (C++)
Répondre
signal
n'est pas le moyen le plus fiable car il est différent 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;
}
Je pense que my_handler devrait prendre 'int s' comme argument. 'sig_t' est lui-même un type de pointeur de fonction. –
Fonctionne sur OSX. Dans mon fichier main.mm, je n'avais même pas besoin d'inclure signal.h, stdlib.h ou unistd.h. J'ai juste inclus stdio.h et Foundation/Foundation.h, et si j'avais besoin de faire des trucs std :: cout pour sortir un message d'arrêt, j'ai inclus iostream. – Volomike
Vous devez attraper le SIGINT signal (nous parlons Posix droit?)
Voir @Gab Royer's réponse pour 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;
}
Oui, c'est une question dépendante de la plateforme.
Si vous écrivez un programme de console sur POSIX, utilisez le signal API (#include <signal.h>).
Dans une application WIN32 GUI, vous devez gérer le message WM_KEYDOWN.
Pour une application console Windows, vous souhaitez utiliser SetConsoleCtrlHandler pour gérer CTRL +C et CTRL +PAUSE. Pour un exemple, voir here.
Application console, application Windows, ou quoi? – GManNickG
Quel OS Windows, Linux, etc. – shf301
Eh bien, c'est une application Qt, mais je l'exécute à partir de la console au cours du développement. (Ceci est Linux) – Scott