Каков точно эффект Ctrl-C на C++ консольные приложения Win32?

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)

и

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

Макросы UI_USER_INTERFACE_IDIOM () также работают в старых версиях iOS, таких как iOS 3.0, без сбоев.

16
задан Assaf Lavie 27 May 2009 в 08:34
поделиться

3 ответа

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

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

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

7
ответ дан 30 November 2019 в 21:46
поделиться

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

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

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

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

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

4
ответ дан 30 November 2019 в 21:46
поделиться

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

13
ответ дан 30 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: