J'essaye d'intégrer la bibliothèque d'octave dans un programme plus grand. Il est nécessaire que je puisse démarrer et arrêter l'interprète d'octave à volonté à partir de ce programme plus grand. Cependant, la seule fonction permettant d'arrêter proprement l'interpréteur d'octave appelle également exit(), ce qui tue également le plus grand programme. La fonction de la bibliothèque d'octave est clean_up_and_exit().Appeler une fonction de bibliothèque avec une torsion - modifier une partie de son comportement
Idéalement, je voudrais appeler seulement la partie de nettoyage (do_octave_atexit), et passer l'appel pour quitter.
J'ai essayé les éléments suivants:
1) appelant do_octave_atexit, mais le symbole est pas exporté dans la bibliothèque d'octave. J'ai essayé d'y accéder de toute façon mais en vain.
2) J'ai essayé de me connecter à l'appel pour quitter et de le remplacer par une fonction qui ne se termine pas, via ld_preload. Cela a gâché tout comme tous les autres appels à la sortie ont été accrochés aussi.
3) J'ai essayé de détecter quand la sortie était appelée par octave seulement pour l'empêcher seulement alors, en détectant la fonction d'appel avec un appel de backtrace. Ceci pour une raison quelconque n'a pas montré ce que je m'attendrais à être la vraie hiérarchie d'appel. Pour une raison quelconque, il n'a montré que la fonction principale, et aucun contenu de la hiérarchie d'appel à travers la bibliothèque d'octave. Donc dans n'a pas pu détecter l'appel venant d'octave.
Le code J'utilise pour appeler les fonctions d'octave ressemble:
//
// Octave Setup Functions
//
extern "C" void oct_init (const char * path) {
string_vector argv (2);
argv(0) = "embedded";
argv(1) = "-q";
octave_main (2, argv.c_str_vec(), 1);
if(strlen(path) > 1) {
oct_addpath(path);
}
}
extern "C" void oct_exit (void) {
printf("Exiting!");
clean_up_and_exit (1,1);
}
La fonction clé ici est clean_up_and_exit - qui est mis en œuvre dans la source d'octave comme:
void clean_up_and_exit (int retval, bool safe_to_return)
{
do_octave_atexit();
if (octave_link::exit (retval))
{
if (safe_to_return)
return;
else
{
gnulib::sleep (86400);
}
}
else
{
if (octave_exit)
(*octave_exit) (retval);
}
}
Ainsi, le ci-dessus code appelle la fonction que je veux (do_octave_atexit), mais continue à appeler * octave_exit - qui est un pointeur de fonction à exit().
Idéalement, je veux soit a) empêcher cet appel de quitter(), soit b) intercepter l'appel quand il vient d'octave seulement et l'empêcher, et l'autoriser quand il vient d'autres sources. Je n'ai pas été capable de faire a) ou b) jusqu'à présent!
Donc à ce stade, je suis à court d'idées. Je pourrais recompiler l'octave, mais cette solution est supposée fonctionner avec une installation octave en stock.
Cela ne devait fonctionner que sur un environnement linux/gcc.
Toutes les suggestions à ce problème très délicat ont été grandement appréciées.
pourriez-vous montrer votre exemple de code, celui où vous démarrez l'interpréteur d'octave, quittez, et l'amène également à quitter votre propre programme? – carandraug
Qu'en est-il de l'exécution d'octave en tant que processus séparé et de communication par tuyau? – fukanchik
@fukanchik Cela semble très intéressant comme alternative. Avez-vous des exemples de comment cela peut être fait à partir de C? Le tuyau peut-il être ouvert comme un «handle» qui persiste entre plusieurs appels jusqu'à ce qu'il soit fermé? –