从强制退出的 C 库函数生成异常

Generate exception from a C library function that forces quit

本文关键字:库函数 异常 退出      更新时间:2023-10-16

我正在尝试使用C++包装C库函数。该函数尝试初始化设备。出错时,它会强制程序的执行终止(可能带有exit(1))。我想在错误时抛出一个异常。有没有办法在不编辑 C 源的情况下做到这一点?

我可以以某种方式禁止被调用的函数终止程序吗?

安装atexit处理程序,从处理程序引发异常。呸。

附言。因此,正如人们指出的那样,C++异常不起作用,那么我们使用 C"异常":

#include <cstdlib>
#include <iostream>
#include <csetjmp>
jmp_buf buf;
void foo ()
{
        longjmp (buf, 1);
}
void bar () { exit(-1); }
int
main ()
{
        atexit (foo);

        if (setjmp (buf))
        {
                bar ();
        }
        else
        {
                std::cout << "graceful" << std::endl;
        }
        return 0;
}

如果你使用的是 Unix/Linux,你可以strace检查你的库到底调用了什么,然后你可以使用 LD_PRELOAD 覆盖调用的函数。

不是一个超级好的解决方案,但应该可以工作:分叉一个新进程并在子进程中调用该 C 函数。在父进程中,等待子进程完成,检查错误码,如果为 1,表示调用了exit(1),则抛出异常。