2011-08-30 25 views
5

Estoy portando un programa de Windows en Linux. Mi programa usa el manejo de excepciones estructurado de Windows (SEH). Linux no admite el manejo estructurado de excepciones, sin embargo, proporciona manejo de señales. Podemos anular la señal para desarrollar SEH como paradigma.Manejo de excepciones en linux

vez que son capaces de filtrar la excepción de Windows ofrece tres alternativas flujos de control de ejecución:

1) EXCEPTION_EXECUTE_HANDLER: Ejecutar manejador 2) EXCEPTION_CONTINUE_SEARCH: Desviar la excepción siguiente bloque (si no existe entonces a OS) 3) EXCEPTION_CONTINUE_EXECUTION: continúe la excepción de la instrucción donde se ha producido la interrupción.

¿Cómo puedo lograr este control fluye en Linux. En Linux, una vez que maneja la señal, el programa inicia la ejecución desde donde se ha interrumpido. ¿Cómo desarrollar los paradigmas continue_search y execute_handler?

Gracias de antemano

Respuesta

5

No hay manera fácil de hacer lo que queremos aquí en C++. Sus herramientas son el mecanismo de excepción estándar de C++ y sigaction. Un controlador sigaction puede devolver el control a donde lo dejó. Puede arrojar, aunque ha habido controversia sobre la seguridad de esto. Algunos dirían que tiene que establecer una variable atómica y regresar. (El problema es que el compilador no ve posibilidad de lanzamiento y por eso no se prepara).

Si está trabajando en C, tiene opciones complejas adicionales relacionadas con sigsetjmp, que es más o menos importante en los esteroides , riesgos y todo.

Dado que no ha especificado un idioma, o qué condición excepcional está tratando de resolver, no es práctico ofrecer una receta más específica.

+0

Gracias por su respuesta. – Utkarsh

+0

Estoy usando el lenguaje C++. Es posible que deba extraer esta funcionalidad y crear un archivo de objeto compartido. También me temo si puedo admitir el manejo de señal dentro de la biblioteca compartida. Además, ¿qué pasa si el desarrollador de la aplicación ha anulado la señal con algún otro controlador. – Utkarsh

+0

He leído acerca de la sigaction. Como ha descrito, devuelve el control a donde lo dejó. Pero, también requiero saltar/ejecutar un código particular sin pasar por el flujo existente (ejecutar el bloqueo catch y continuar la búsqueda en los bloques de arriba). No estoy seguro de cómo lograr esta funcionalidad. – Utkarsh