【问题标题】:How can I catch a ctrl-c event?如何捕捉 ctrl-c 事件?
【发布时间】:2018-10-13 19:09:29
【问题描述】:

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

【问题讨论】:

  • 控制台应用程序、Windows 应用程序还是什么?
  • Windows、Linux 等操作系统。
  • 嗯,它是一个 Qt 应用程序,但我在开发期间从控制台运行它。 (这是 Linux)

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


【解决方案1】:

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

【讨论】:

  • 我认为 my_handler 应该将int s 作为它的论点。 sig_t 本身就是一个函数指针类型。
  • 等 - 它是 C,而不是 C++。在 C++ 中,您应该使用
  • printf() 不是异步信号安全的,因此不能在信号处理程序中使用。
  • 这些功能在 Windows 上不可用。
  • 希望对sa_masksa_flags 有一些解释。
【解决方案2】:

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

有关示例,请参阅 here

【讨论】:

    【解决方案3】:

    你必须抓住 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;
    
    }
    

    【讨论】:

    • 是的,它是 POSIX。我忘了在问题中添加 Linux。
    • signal() 的行为不同,具体取决于它遵循 BSD 还是 SysV 风格。 sigaction() 更可取。
    • 我知道它很旧,但这不能在 g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 中编译。我不得不将void my_handler(sig_t s) 更改为void my_handler(sig_atomic_t s)
    【解决方案4】:

    是的,这是一个依赖于平台的问题。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多