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

+1: Отличный вопрос :) –

+0

Отличная ручка :) –

ответ

7

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

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

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

+0

Спасибо. fyi, связанная с вами страница MSDN предполагает, что система отправляет SIGINT (и что NT вверх не отправляет SIGTERM вообще). –

+0

Спасибо, Ассаф. Исправленный. –

+0

Кроме того, SIGINT, который преобразуется в ExitProcess, не вызывает разрушения любого объекта (глобального, локального статического, автоматического). Если, otoh, вы переводите sigint в exit(), globals/statics будет деструктором в обратном порядке инициализации (но автоматики нет). –

13

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

+0

+1 для ответа на вопрос! –

+1

Как насчет освобождения статики? –

4

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

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

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

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

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

+0

Хороший тест! Я стою исправлено. –

+0

Мне сложно доверять такой тест, потому что я никогда не буду уверен, будет ли поведение отличаться для разных конфигураций проектов (например, libs, dll, native, managed, multi-threaded и их комбинации). Поэтому я предпочел бы «истинный» ответ и не полагаться на такой тест сам. –

+0

Не существует «истинного» ответа - на C++ Standard нечего сказать по этому вопросу, поэтому то, что вы получите, всегда будет зависимым от реализации. – 2009-05-27 11:32:12

Смежные вопросы