165 votes

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

Comment attraper un Ctrl + C en C++ ?

0 votes

Application console, application Windows, ou quoi ?

9 votes

Quel OS : Windows, Linux, etc.

1 votes

C'est une application Qt, mais je l'exécute depuis la console pendant le développement. (C'est Linux)

204voto

Gab Royer Points 4209

signal n'est pas le moyen le plus fiable car il diffère selon les implémentations. Je recommande 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;    
}

2 votes

Je pense que mon_handler devrait prendre int s comme argument. sig_t est lui-même un type de pointeur de fonction.

50 votes

<stdlib.h>, etc - c'est du C, pas du C++. En C++ vous devriez utiliser <cstdlib>

0 votes

Cela fonctionne sous OSX. Dans mon fichier main.mm, je n'ai même pas eu besoin d'inclure signal.h, stdlib.h, ou unistd.h. J'ai juste inclus stdio.h et Foundation/Foundation.h, et ensuite si j'avais besoin de faire des trucs de type std::cout pour sortir un message d'arrêt, j'ai inclus iostream.

66voto

Chris Smith Points 2858

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

Voir ici pour un exemple.

50voto

Tom Points 16783

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

Voir la réponse de @Gab Royer 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;

}

1 votes

Oui, c'est POSIX. J'ai oublié d'ajouter Linux à la question.

5 votes

Signal() se comporte différemment, selon qu'il suit le style BSD ou SysV. sigaction() est préférable.

10 votes

Je sais que c'est vieux, mais cela ne compile pas dans g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0. J'ai dû changer void my_handler(sig_t s) à void my_handler(sig_atomic_t s) .

2voto

Joyer Points 81

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

Si vous écrivez un programme console sous POSIX, utilisez l'API de signal ( #include <signal.h> ).

Dans une application WIN32 GUI, vous devez gérer l'icône WM_KEYDOWN message.

-2voto

ShaChris23 Points 7713

Pour ce que ça vaut, voici comment je l'ai fait dans mon programme :

  QChar chr(getch());
  if(chr == 3)
  {
    emit sigCtrlC();
  }

Je l'ai testé, et ça marche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X