estoy respondiendo como el de Linux, pero todo esto debe aplicarse a las ventanas.
Tuve esta pregunta similar, así que espero poder resumir las respuestas anteriores y agregar mis dos centavos.
Señales y abort()
: ^C
y ^Z
pueden ser "interceptados" para llamar a su función antes de salir, presumiblemente con exit(). Las señales SIGQUIT
AKA ^\
y SIGKILL
que no tienen golpe de tecla no pueden ser interceptadas. Aquí hay un ejemplo para usar el encabezado csignal
y una 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;
}
Salir: Desde que utiliza exit()
en mis ejemplos anteriores, se debe tener cuidado aquí. Si la función que se está ejecutando es una función de limpieza que solo necesita ejecutarse una vez, quizás se pueda usar una variable estática has_run
. O en el ejemplo anterior, raise()
, una señal que no puede interceptar. Pero esos tienden a venir con vertederos que simplemente se sienten sucios. Tu elección, aquí. Un ejemplo sigue
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
//called with no parameters
auto lam = []() { cout << "at exit"; };
atexit(lam);
return 0;
}
toman nota de que C++ 11 añade un quick_exit
que tiene una at_quick_exit
acompaña, que actúan igual que el anterior.Pero con quick_exit
no se realizan tareas de limpieza. Por el contrario, con exit
se invocan destructores de objeto y se cierran flujos de C, con solo variables de almacenamiento automático que no se limpian.
No es posible en todos los casos: algunas señales reducen el proceso de inmediato, lo quieras o no. (por ejemplo, desbordamiento de pila) –
¿Qué sistema operativo? –