Что такое эффект Ctrl-C на консольных приложениях С++ Win32?

  • Можно ли каким-то образом обработать это событие?
  • Что происходит с точки зрения раскрутки стека и освобождения статических/глобальных объектов?

Ответ 1

EDIT: SIGINT, а не SIGTERM. И Assaf сообщает, что ни один объект не уничтожается (по крайней мере, в Windows) для неподготовленного SIGINT.

Система отправляет SIGINT. Эта концепция применяется (с некоторой дисперсией) для всех реализаций C. Для его обработки вы вызываете сигнал, указав обработчик сигнала. См. Документацию по функции сигнала в Открыть группу и MSDN.

Второй вопрос немного сложнее и может зависеть от реализации. Лучше всего обрабатывать сигнал, который позволяет вручную использовать delete и exit().

Ответ 2

Ctrl-C в приложении консоли будет генерировать сигнал. Обработчик по умолчанию этого сигнала вызывает ExitProcess для завершения работы приложения. Вы можете переопределить это поведение, установив собственные функции обработчика для сигнала, используя функцию SetConsoleCtrlHandler.

Ответ 3

Вы можете проверить, происходит ли удаление строк с помощью простого кода:

#include <iostream>
#include <windows.h>
using namespace std;

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

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

Независимо от того, происходит ли это не должно быть зависимым от реализации, в зависимости от того, как среда выполнения обрабатывает Ctrl-C. По моему опыту, этого не происходит.