Перехват Fortran STOP из C ++
Я подготовил интерфейс C ++ к устаревшей библиотеке Fortran.
Некоторые подпрограммы в устаревшей библиотеке следуют уродливому, но пригодному для использования соглашению о кодах состояния, чтобы сообщать об ошибках, и я использую такие коды состояния, чтобы генерировать читабельное исключение из моего кода C ++: это прекрасно работает.
С другой стороны, иногда устаревшая библиотека вызываетSTOP
(что завершает программу). И он часто делает это, хотя состояние можно исправить.
я бы хотелзахватить этотSTOP
изнутри C ++, и до сих пор мне не удалось.
Следующий код прост, но точно представляет проблему под рукой:
Библиотека наследия Фортрана:fmodule.f90
module fmodule
use iso_c_binding
contains
subroutine fsub(x) bind(c, name="fsub")
real(c_double) x
if(x>=5) then
stop 'x >=5 : this kills the program'
else
print*, x
end if
end subroutine fsub
end module fmodule
Интерфейс C ++:main.cpp
#include
// prototype for the external Fortran subroutine
extern "C" {
void fsub(double& x);
}
int main() {
double x;
while(std::cin >> x) {
fsub(x);
}
return 0;
}
Строки компиляции (GCC 4.8.1 / OS X 10.7.4;$
обозначает командную строку):
$ gfortran -o libfmodule.so fmodule.f90 -shared -fPIC -Wall
$ g++ main.cpp -L. -lfmodule -std=c++11
Бег:
$ ./a.out
1
1.0000000000000000
2
2.0000000000000000
3
3.0000000000000000
4
4.0000000000000000
5
STOP x >=5 : this kills the program
Как я мог захватитьSTOP
и, скажем, запросить другой номер. Обратите внимание, что яне хочу трогать код Фортрана.
Что я пробовал:
std::atexit
: не могу "Вернись" из него однажды я ввел его:std::signal
STOP
кажется, не дает сигнал, который я могу захватить