如何捕获ctrl-c事件?

时间:2009-10-29 01:39:03

标签: c++ event-handling posix signals sigint

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

4 个答案:

答案 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消息。