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

前端 未结 3 1299
耶瑟儿~
耶瑟儿~ 2021-01-17 10:57
  1. Is it possible to handle this event in some way?
  2. What happens in terms of stack unwinding and deallocation of static/global objects?
相关标签:
3条回答
  • 2021-01-17 11:27

    Ctrl-C in console application will generate a signal. The default handler of this signal calls ExitProcess to terminate the application. You can override this behaviour by setting your own handler functions for the signal using SetConsoleCtrlHandler function.

    0 讨论(0)
  • 2021-01-17 11:51

    EDIT: SIGINT, not SIGTERM. And Assaf reports that no objects are destroyed (at least on Windows) for unhanded SIGINT.

    The system sends a SIGINT. This concept applies (with some variance) for all C implementations. To handle it, you call signal, specifying a signal handler. See the documentation on the signal function at Open Group and MSDN.

    The second question is a little trickier, and may depend on implementation. The best bet is to handle the signal, which allows you to use delete and exit() manually.

    0 讨论(0)
  • 2021-01-17 11:53

    You can test whether stack unwinding occurs, with some simple code:

    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    struct A {
        ~A() { cerr << "unwound" << endl; }
    };
    
    int main() {
        A a;
        while(1) {
            Sleep(1000);
        }
    }
    

    Whether it occurs not should be implementation dependant, depending on how the runtime handles the Ctrl-C. In my experience, it does not take place.

    0 讨论(0)
提交回复
热议问题