gpt4 book ai didi

c++ - 调用一个库函数,修改它的一些行为

转载 作者:行者123 更新时间:2023-11-30 05:45:25 24 4
gpt4 key购买 nike

我正在尝试将 Octave 库嵌​​入到一个更大的程序中。要求我可以从这个更大的程序中随意启动和停止 Octave 音阶解释器。然而,唯一干净地停止 Octave 解释器的函数也调用了 exit(),它也杀死了更大的程序。 Octave库函数是clean_up_and_exit()。

理想情况下,我只想调用清理部分 (do_octave_atexit),并跳过退出调用。

我尝试了以下方法:

1) 调用 do_octave_atexit,但符号未导出到 Octave 库中。我尝试访问它,但无济于事。

2) 我尝试 Hook 退出调用,并通过 ld_preload 将其替换为不退出的函数。这把一切都搞砸了,因为所有其他退出调用也被 Hook 了。

3) 我试图检测 exit 何时被 octave 调用,只是为了防止它发生,方法是通过调用回溯来检测调用函数。由于某种原因,这没有显示出我所期望的真正的调用层次结构。由于某种原因,它只显示了主要功能,而没有通过 Octave 库调用层次结构的内容。所以 in 无法检测到来自 Octave 的调用。

我用来调用 Octave 函数的代码如下所示:

//
// 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);
}

这里的关键函数是 clean_up_and_exit - 它在 Octave 源中实现为:

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);
}
}

所以上面的代码调用了我想要的函数 (do_octave_atexit),然后继续调用 *octave_exit - 这是一个指向 exit() 的函数指针。

理想情况下,我想要么 a) 阻止对 exit() 的调用,要么 b) 当调用仅来自 Octave 音程时捕获并阻止它,并在它来自其他来源时允许它。到目前为止,我还无法执行 a) 或 b)!

所以在这一点上我没有想法。我可以重新编译 Octave,但此解决方案应该适用于现有的 Octave 安装。

这只需要在 linux/gcc 环境下工作。

非常感谢对这个非常棘手的问题提出的任何和所有建议。

最佳答案

您将不得不 fork 并在单独的进程上运行 Octave。这是一个简单的示例,说明如何执行此操作:

#include <unistd.h>
#include <iostream>

#include <octave/oct.h>
#include <octave/octave.h>
#include <octave/parse.h>
#include <octave/toplev.h>

int
main_octave (void)
{
string_vector argv (2);
argv(0) = "embedded";
argv(1) = "-q";

octave_main (2, argv.c_str_vec (), 1);

octave_value_list out = feval ("pi", octave_value_list (0), 1);
if (! error_state && out.length () > 0)
std::cout << "pi is " << out(0).double_value () << std::endl;
else
std::cout << "invalid\n";

clean_up_and_exit (0);
}

int
main (void)
{
pid_t pid = fork();
if (pid == 0)
main_octave ();
else if (pid > 0)
{
std::cout << "Parent process going for a nap" << std::endl;
sleep (5);
}
else
{
std::cout << "Unable to fork()" << std::endl;
return 1;
}
std::cout << "Leaving standalone application" << std::endl;
return 0;
}

我的系统返回:

$ mkoctfile --link-stand-alone embedded.cc -o embedded
$ ./embedded
Parent process going for a nap
pi is 3.14159
Leaving standalone application

因此您可以在退出 Octave 进程后继续运行您的应用程序。当然,如果你想多次启动和停止 Octave,那么你将不得不 fork 多次。此外,我建议您在 Octave 帮助邮件列表中询问此类问题,您更有可能在那里更快地获得有用的答案。

关于c++ - 调用一个库函数,修改它的一些行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29380614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com