How can I catch a ctrl-c event?
C++Event HandlingPosixSignalsSigintC++ Problem Overview
How do I catch a Ctrl+C event in C++?
C++ Solutions
Solution 1 - C++
signal
isn't the most reliable way as it differs in implementations. I would recommend using sigaction
. Tom's code would now look like this :
#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;
}
Solution 2 - C++
For a Windows console app, you want to use https://docs.microsoft.com/en-us/windows/console/setconsolectrlhandler">SetConsoleCtrlHandler</a> to handle CTRL+C and CTRL+BREAK.
See https://docs.microsoft.com/en-us/windows/console/registering-a-control-handler-function">here</a> for an example.
Solution 3 - C++
You have to catch the SIGINT signal (we are talking POSIX right?)
See @Gab Royer´s answer for sigaction.
Example:
#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;
}
Solution 4 - C++
Yeah, this is a platform dependent question.
If you are writing a console program on POSIX,
use the signal API (#include <signal.h>
).
In a WIN32 GUI application you should handle the WM_KEYDOWN
message.