145

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

4

4 回答 4

183

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;    
}
于 2009-10-29T01:55:37.923 回答
58

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

有关示例,请参见此处。

于 2009-10-29T02:29:12.567 回答
42

你必须捕捉到 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;

}
于 2009-10-29T01:41:19.287 回答
1

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

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

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

于 2009-10-29T01:56:36.190 回答