Как именно влияет Ctrl-C на консольные приложения C ++ Win32? - PullRequest
16 голосов
/ 27 мая 2009
  1. Можно ли как-то обработать это событие?
  2. Что происходит с точки зрения разматывания стека и освобождения статических / глобальных объектов?

Ответы [ 3 ]

13 голосов
/ 27 мая 2009

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

7 голосов
/ 27 мая 2009

РЕДАКТИРОВАТЬ: SIGINT, а не SIGTERM. А Ассаф сообщает, что ни один объект не был уничтожен (по крайней мере, в Windows) для неуправляемого SIGINT.

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

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

4 голосов
/ 27 мая 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...