Jak złapać zdarzenie C++ w C++?Jak mogę złapać zdarzenie ctrl-c? (C++)
Odpowiedz
signal
nie jest najbardziej niezawodny sposób, ponieważ różni się w realizacji. Polecam używanie sigaction
. Kod Toma wyglądałby teraz 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;
}
Myślę, że my_handler powinien przyjąć 'int s' jako argument. 'sig_t' sam jest typem wskaźnika funkcji. –
Działa na OSX. W pliku main.mm nie potrzebowałem nawet signal.h, stdlib.h ani unistd.h. Po prostu włączyłem stdio.h i Foundation/Foundation.h, a następnie, jeśli potrzebowałem zrobić std :: cout stuff dla wyprowadzenia komunikatu o zamknięciu, włączyłem iostream. – Volomike
Trzeba złapać SIGINT signal (mówimy POSIX prawda?)
See @Gab Royer's 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;
}
Tak, to jest pytanie zależne od platformy.
Jeśli piszesz program konsoli na POSIX, użyj sygnału API (#include <signal.h>).
W aplikacji GUI WIN32 należy obsłużyć wiadomość WM_KEYDOWN.
Dla app konsoli Windows chcesz użyć SetConsoleCtrlHandler obsłużyć CTRL + C i CTRL + BREAK.
Przykładem jest here.
Aplikacja konsolowa, aplikacja systemu Windows lub co? – GManNickG
Który system operacyjny Windows, Linux itp. – shf301
Cóż, jest to aplikacja Qt, ale uruchamiam ją z konsoli podczas programowania. (To jest Linux) – Scott