Interceptando la parada de Fortran desde C ++

Preparé una interfaz C ++ para una biblioteca heredada de Fortran.

Algunas subrutinas en la biblioteca heredada siguen una convención de código de estado fea pero utilizable para informar errores, y uso dichos códigos de estado para lanzar una excepción legible desde mi código C ++: funciona muy bien.

Por otro lado, a veces la biblioteca legada llama.STOP (que termina el programa). Y a menudo lo hace a pesar de que la condición es recuperable.

me gustaríacapturar estaSTOP desde dentro de C ++, y hasta ahora no he tenido éxito.

El siguiente código es simple, pero representa exactamente el problema en cuestión:

La biblioteca legada de Fortranfmodule.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

La interfaz de C ++main.cpp:

#include<iostream>

// prototype for the external Fortran subroutine
extern "C" {
  void fsub(double& x);  
}

int main() {  
  double x;
  while(std::cin >> x) {
    fsub(x);
  }
  return 0;
}

Las líneas de compilación (GCC 4.8.1 / OS X 10.7.4;$ denota el símbolo del sistema):

$ gfortran -o libfmodule.so fmodule.f90 -shared  -fPIC -Wall
$ g++ main.cpp -L. -lfmodule -std=c++11

La carrera:

$ ./a.out 
1
   1.0000000000000000     
2
   2.0000000000000000     
3
   3.0000000000000000     
4
   4.0000000000000000     
5
STOP x >=5 : this kills the program

¿Cómo podría capturar elSTOP y, digamos, pedir otro número. Notar que yoNo quiero tocar el código de Fortran..

Lo que he intentado:

std::atexit: no puedo "volver" de él una vez que lo haya ingresadostd::signal: STOP No parece lanzar una señal que yo pueda capturar.

Respuestas a la pregunta(4)

Su respuesta a la pregunta