я отвечаю, как пользователь Linux, но все это должно относиться к окнам.
У меня был этот похожий вопрос, поэтому, надеюсь, я смогу подвести предыдущие ответы и добавить свои два цента.
Сигналы и abort()
: ^C
и ^Z
могут быть «перехвачены», чтобы вызвать функцию перед выходом, предположительно с выходом(). Сигналы SIGQUIT
AKA ^\
и SIGKILL
, которые не имеют нажатия клавиши, не могут быть перехвачены. Ниже приведен пример использования заголовка csignal
и лямбда C++.
#include <iostream>
#include <csignal>
#include <cstdlib>
using namespace std;
int main()
{
//signal requires lam take an int parameter
//this parameter is equal to the signals value
auto lam =
[] (int i) { cout << "aborting" << endl; exit(0); };
//^C
signal(SIGINT, lam);
//abort()
signal(SIGABRT, lam);
//sent by "kill" command
signal(SIGTERM, lam);
//^Z
signal(SIGTSTP, lam);
while(1)
{
}
return 0;
}
Выход: Так как я использовал exit()
в моих примерах выше, необходимо соблюдать осторожность здесь. Если выполняемая функция является функцией очистки, которая должна выполняться только один раз, возможно, может использоваться статическая переменная has_run
. Или в приведенном выше примере raise()
сигнал, который вы не можете перехватить. Но те, как правило, приходят с основными отвалами, которые просто чувствуют себя грязными. Ваш выбор, здесь. Пример следующим образом
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
//called with no parameters
auto lam = []() { cout << "at exit"; };
atexit(lam);
return 0;
}
принять к сведению, что C++ 11 добавили quick_exit
, который имеет сопутствующую at_quick_exit
, которые действуют так же, как указано выше.Но с quick_exit
не выполняются задачи очистки. Напротив, с exit
вызываются объекты-деструкторы и потоки C закрываются, и только автоматические переменные хранилища не очищаются.
Невозможно во всех случаях - некоторые сигналы немедленно прекращают процесс, хотите ли вы их или нет. (например, переполнение стека) –
Какая операционная система? –