Jak mogę złapać Zdarzenie ctrl-c?

Jak złapać Ctrl+C event w C++?

Author: Uwe Keim, 2009-10-29

4 answers

signal nie jest najbardziej niezawodny sposób, ponieważ różni się w implementacjach. Polecam użycie sigaction. Kod Toma będzie teraz wyglądał tak:

#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;    
}
 176
Author: Gab Royer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-28 11:28:54

Dla aplikacji konsoli Windows, chcesz użyć SetConsoleCtrlHandler do obsługi CTRL+C i CTRL+BREAK .

Zobacz tutaj dla przykładu.

 54
Author: Chris Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-02 19:49:19

Musisz złapać sygnał SIGINT (mówimy o POSIX prawda?)

Zobacz @Gab Royers odpowiedź dla sigaction.

Przykład:

#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;

}
 40
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-29 02:16:14

Tak, to pytanie zależne od platformy.

Jeśli piszesz program konsolowy na POSIX, użyj signal API (#include <signal.h>).

W aplikacji WIN32 GUI powinieneś obsługiwać wiadomość WM_KEYDOWN.

 1
Author: Joyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-21 09:13:17