vuelve seguir puedo pueden porque poner permite los intentarlo hashtags guardaron guardan funcionan cuantos cambios aparezco c++ destructor sigint

c++ - seguir - ¿Se llama a destructor si se emiten SIGINT o SIGSTP?



porque no puedo seguir hashtag en instagram (3)

No, por defecto, la mayoría de las señales causan una salida inmediata y anormal de su programa.

Sin embargo, puede cambiar fácilmente el comportamiento predeterminado para la mayoría de las señales.

Este código muestra cómo hacer que una señal salga de su programa normalmente, incluso llamando a todos los destructores habituales:

#include <iostream> #include <signal.h> #include <unistd.h> #include <cstring> #include <atomic> std::atomic<bool> quit(false); // signal flag void got_signal(int) { quit.store(true); } class Foo { public: ~Foo() { std::cout << "destructor/n"; } }; int main(void) { struct sigaction sa; memset( &sa, 0, sizeof(sa) ); sa.sa_handler = got_signal; sigfillset(&sa.sa_mask); sigaction(SIGINT,&sa,NULL); Foo foo; // needs destruction before exit while (true) { // do real work here... sleep(1); if( quit.load() ) break; // exit normally after SIGINT } return 0; }

Si ejecuta este programa y presiona control-C, debería ver la palabra "destructor" impresa. Tenga en cuenta que las funciones de su manejador de señales (got_signal) rara vez deben realizar algún trabajo, aparte de establecer una bandera y regresar en silencio, a menos que realmente sepa lo que está haciendo.

La mayoría de las señales se pueden capturar como se muestra arriba, pero no SIGKILL, usted no tiene control sobre ellas porque SIGKILL es un método de último momento para matar un proceso fuera de control, y no SIGSTOP, que permite a un usuario congelar un proceso en frío. Tenga en cuenta que puede capturar SIGTSTP (control-Z) si lo desea, pero no es necesario si su único interés en las señales es el comportamiento del destructor, porque finalmente, después de un control-Z, el proceso se activará, continuará ejecutándose y saldrá normalmente con todos los destructores en efecto.

Tengo una clase con un destructor definido por el usuario. Si la clase se creó una instancia inicialmente, y luego se emite SIGINT (utilizando CTRL + C en Unix) mientras se ejecuta el programa, ¿se llamará al destructor? ¿Cuál es el comportamiento de SIGSTP (CTRL + Z en Unix)?


Si no maneja estas señales usted mismo, entonces, no, los destructores no son llamados. Sin embargo, el sistema operativo recuperará los recursos que su programa usó cuando finaliza.

Si desea manejar señales usted mismo, entonces considere verificar la función de biblioteca estándar sigaction .


Vamos a intentarlo:

#include <stdio.h> #include <unistd.h> class Foo { public: Foo() {}; ~Foo() { printf("Yay!/n"); } } bar; int main(int argc, char **argv) { sleep(5); }

Y entonces:

$ g++ -o test ./test.cc $ ./test ^C $ ./test Yay!

Así que me temo que no, tendrás que atraparlo.

En cuanto a SIGSTOP , no se puede capturar y detiene el proceso hasta que se envía un SIGCONT .