如何捕获 ctrl-c 事件?

如何在 C + + 中捕获 Ctrl + C事件?

159729 次浏览

您必须捕捉 SIGINT 信号(我们说的是 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;


}

signal不是最可靠的方法,因为它在实现上有所不同。我建议使用 sigaction。Tom 的代码现在应该是这样的:

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

是的,这是一个平台相关的问题。

如果您在 POSIX 上编写控制台程序, 使用信号 API (#include <signal.h>)。

在 WIN32GUI 应用程序中,您应该处理 WM_KEYDOWN消息。

对于 Windows 控制台应用程序,您希望使用 SetConsole CtrlHandler来处理 CTRL + CCTRL + BREAK

有关示例,请参见 给你