如何在C ++中捕获 Ctrl + C 事件?
答案 0 :(得分:157)
signal
不是最可靠的方式,因为它在实现方面有所不同。我建议使用sigaction
。汤姆的代码现在看起来像这样:
#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;
}
答案 1 :(得分:47)
对于Windows控制台应用,您希望使用SetConsoleCtrlHandler来处理 CTRL + C 和 CTRL + BREAK
有关示例,请参阅here。
答案 2 :(得分:31)
你必须抓住SIGINT signal(我们正在谈论POSIX吗?)
请参阅@Gab Royer对sigaction的回答。
示例:
#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;
}
答案 3 :(得分:1)
是的,这是一个与平台有关的问题。
如果您正在POSIX上编写控制台程序, 使用信号API(#include&lt; signal.h&gt;)。
在WIN32 GUI应用程序中,您应该处理WM_KEYDOWN消息。