ja odpowiadam jako użytkownik Linuksa, ale wszystko to powinno mieć zastosowanie do okien.
Miałem to podobne pytanie, więc mam nadzieję, że mogę podsumować poprzednie odpowiedzi i dodać moje dwa centy.
Sygnały i abort()
: ^C
i ^Z
można "przechwycić", aby wywołać funkcję przed wyjściem, prawdopodobnie przy pomocy exit(). Sygnały SIGQUIT
AKA ^\
i , które nie mają naciśnięcia klawisza, nie mogą zostać przechwycone. Oto przykład użycia nagłówka csignal
i lambda 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;
}
Wyjście: Ponieważ użyłem exit()
w moich przykładach powyżej, należy uważać tutaj. Jeśli uruchomiona funkcja jest funkcją czyszczącą, która musi zostać uruchomiona tylko raz, być może można użyć zmiennej statycznej has_run
. Lub w powyższym przykładzie raise()
sygnał, którego nie możesz przechwycić. Ale te mają tendencję do przychodzenia z rdzennymi wysypiskami, które są po prostu brudne. Twój wybór, tutaj. Przykładem następująco
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
//called with no parameters
auto lam = []() { cout << "at exit"; };
atexit(lam);
return 0;
}
zwrócić uwagę, że C++ 11 dodał quick_exit
który ma towarzyszącego at_quick_exit
które działają tak samo jak wyżej.Ale z quick_exit
nie są wykonywane żadne zadania czyszczenia. Przeciwnie, z destruktorami obiektów są wywoływane i strumienie C są zamykane, a tylko automatyczne zmienne pamięci nie są oczyszczane.
Niemożliwe we wszystkich przypadkach - niektóre sygnały spowalniają proces natychmiast, niezależnie od tego, czy chcesz, czy nie. (np. przepełnienie stosu) –
Jaki system operacyjny? –