Я реализовал нечто подобное для тестирования модулей C-bindings для кода Fortran из C / C ++ для перехвата abort
вызовов с использованием setjmp
и longjmp
(по сути, так же, как ответ в ужесвязанный вопрос ):
#include <setjmp.h>
#include <signal.h>
jmp_buf jmp_env;
void on_sigabrt(int signum)
{
(void) signum; // silence "unused parameter" warning
longjmp(jmp_env, 1);
}
void func()
{
if (setjmp(jmp_env) == 0) {
signal(SIGABRT, &on_sigabrt);
/* YOUR CALLS HERE */
} else {
/* ERROR HANDLING GOES HERE */
}
}
Проблема, уже описанная @janneb, остается: даже если longjmp
должен восстановить стек до точки setjmp
, это не гарантирует, что все внутреннее состояниев Фортране библиотека времени выполнения восстановлена.
Фактически обе книги Современный Фортран: стиль и использование (правило 182) и Справочник Фортрана 2003 (15.6.4) отметим, что код на Фортране не следует заключать между setjmp
и longjmp
.
С другой стороны, существуют поставщики компиляторов, которые явно предоставляют setjmp
/ longjmp
оболочки ( Oracle) например), а также несколько проектов с аналогичной направленностью:
Это, как говорится, вероятно, лучше (и болееТаблица) подход к использованию правильной обработки ошибок с использованием атрибута iostat
, когда это возможно, как уже прокомментировали другие.