Jak złapać zdarzenie Ctrl+ Cw C ++?
Odpowiedzi:
signal
nie jest najbardziej niezawodnym sposobem, ponieważ różni się implementacjami. Polecam używanie sigaction
. Kod Toma wyglądałby teraz następująco:
#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;
}
int s
argument. sig_t
jest sam w sobie typem wskaźnika funkcji.
printf()
nie jest bezpieczny dla sygnału asynchronicznego, więc nie może być używany wewnątrz modułu obsługi sygnału.
sa_mask
i sa_flags
.
W przypadku aplikacji konsoli systemu Windows chcesz użyć SetConsoleCtrlHandler do obsługi CTRL+ Ci CTRL+ BREAK.
Zobacz tutaj przykład.
Musisz złapać sygnał SIGINT (mówimy o POSIX, prawda?)
Zobacz odpowiedź @Gab Royer na 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;
}
void my_handler(sig_t s)
się void my_handler(sig_atomic_t s)
.