关于winapi:Ctrl-C对C Win32控制台应用程序的影响到底是什么?

What exactly is the effect of Ctrl-C on C++ Win32 console applications?

  • 是否可以通过某种方式处理此事件?
  • 就堆栈展开和静态/全局对象的重新分配而言,会发生什么?

  • 控制台应用程序中的

    Ctrl-C将生成信号。该信号的默认处理程序调用ExitProcess终止应用程序。您可以通过使用SetConsoleCtrlHandler函数为信号设置自己的处理函数来覆盖此行为。


    编辑:SIGINT,而不是SIGTERM。阿萨夫(Assaf)报告说,没有使用过的SIGINT没有销毁任何对象(至少在Windows上没有)。

    系统发送一个SIGINT。这个概念适用于所有C实现(有一些差异)。要处理它,您可以调用signal,并指定一个信号处理程序。请参阅Open Group和MSDN上有关信号功能的文档。

    第二个问题有些棘手,可能取决于实现方式。最好的选择是处理信号,这使您可以手动使用deleteexit()


    您可以使用一些简单的代码来测试是否发生堆栈退卷:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <windows.h>
    using namespace std;

    struct A {
        ~A() { cerr <<"unwound" << endl; }
    };

    int main() {
        A a;
        while(1) {
            Sleep(1000);
        }
    }

    是否发生取决于运行时如何处理Ctrl-C。以我的经验,它不会发生。