2012-01-19 16 views
5

Aquí está el código en el que configuro mi controlador para la señal SIGABRT y luego llamo al abort() pero el manejador no recibe el trigered, en cambio el programa se cancela, ¿por qué?¿Cómo manejar la señal SIGABRT?

#include <iostream> 
#include <csignal> 
using namespace std; 
void Triger(int x) 
{ 
    cout << "Function triger" << endl; 
} 

int main() 
{ 
    signal(SIGABRT, Triger); 
    abort(); 
    cin.ignore(); 
    return 0; 
} 

PROGRAMA DE SALIDA:

enter image description here

+0

funciona perfectamente aquí, después de incluir ''. ¿Cual plataforma? –

+0

Windows 7 x64 con MSVC++ 2010 (no es necesario incluir cstdlib en el estudio visual) – codekiddy

+1

Bueno, el programa debe abortarse a menos que los manejadores de señal hagan un 'longjmp'. Si desea que el mensaje se imprima antes, es posible que desee eliminar 'std :: cout' (o escribir en' std :: cerr'). –

Respuesta

11

Como han dicho otros, no se puede abortar() devolver y permitir que la ejecución continúe normalmente. Sin embargo, lo que puede hacer es proteger una parte del código que podría llamar abortar con una estructura similar a una captura de prueba. La ejecución del código se cancelará pero el resto del programa puede continuar. He aquí una demostración:

#include <csetjmp> 
#include <csignal> 
#include <cstdlib> 
#include <iostream> 

jmp_buf env; 

void on_sigabrt (int signum) 
{ 
    longjmp (env, 1); 
} 

void try_and_catch_abort (void (*func)(void)) 
{ 
    if (setjmp (env) == 0) { 
    signal(SIGABRT, &on_sigabrt); 
    (*func)(); 
    } 
    else { 
    std::cout << "aborted\n"; 
    } 
}  

void do_stuff_aborted() 
{ 
    std::cout << "step 1\n"; 
    abort(); 
    std::cout << "step 2\n"; 
} 

void do_stuff() 
{ 
    std::cout << "step 1\n"; 
    std::cout << "step 2\n"; 
}  

int main() 
{ 
    try_and_catch_abort (&do_stuff_aborted); 
    try_and_catch_abort (&do_stuff); 
} 
+0

Parece que esta respuesta no está terminada. Nota: ? – stanm

6

Aunque se puede reemplazar controlador para SIGABRT y abort() prestará atención al controlador, el aborto sólo está inhibido si el manejador de la señal no vuelve. La cita relevante en C99 se encuentra en el párrafo 7.20.4.1 2:

el aborto de la función causa la terminación anormal del programa de que se produzca, a menos que el SIGABRT señal está siendo capturado y el manejador de señal no vuelve. ...

Su manejador de señales regresa y, por lo tanto, el programa se cancela.

+0

Entonces, ¿está diciendo que el try_and_catch_abort anterior solo funcionará en modo de depuración, y no para el código liberado? – Michele

2

Usted obtener esos síntomas, es decir, el diálogo emergente de depuración, cuando se tiene una versión de depuración (con ventanas y Visual Studio-Estoy probando con la versión de 2012), ya que establece un descanso de depuración , en la implementación de depuración de abort()). Si elige "Ignorar" se obtiene que el mensaje "Triger Función"

Si lo hace una versión de lanzamiento, entonces no consigue el cuadro de diálogo de depuración emergente, y se obtiene el mensaje, como se esperaba

Cuestiones relacionadas