我们有一个第三方库,在编写时没有考虑多线程或异常处理。我们的主要可执行文件是多线程的并使用异常。
第三方库使用 exit()
来中止严重问题(如“驱动程序未初始化”或“文件未找到”)的程序。不允许在多线程应用程序中调用 exit()
,因为它不会正确关闭线程。此外,我真的不想退出主应用程序,因为它是一个服务器应用程序,而且在很多情况下,主程序可以做一些主动的事情来从错误中恢复。
我想用我自己的函数替换系统提供的 exit(int status)
函数,即
class exit_exception : public runtime_error
{
public: exit_exception(int status)
: runtime_error("exit called with status " + to_string(status)) {}
};
extern "C" void exit(int status) {
throw exit_exception(status);
}
并在我的代码中捕获异常。它似乎有效,但这显然是一种 hack,而不是大自然希望使用 exit()
的方式。我不知道自己做错了什么?
编辑
许多人建议我将它放在一个单独的过程中,但这会破坏很多事情。第三方库执行需要在主应用程序进程中进行的非常高速的数据传输,因为它位于相同的虚拟内存空间中并且不使用 malloc
从 FPGA 协处理器分配内存 Controller 。此代码接近于“铁”,正在从内存和 PCIe 总线中榨取每一位带宽。
编辑2
我的程序仍然可以使用 int main()
的返回值将状态代码返回给操作系统,它不会最终调用 exit()
。否则我会遇到真正的麻烦。
最佳答案
这只是一个想法,但您可以使用类似的方法,就像我需要包装 memcpy
以使用一些不同的版本时所做的那样,看看我的回答 here .
因此,您可以构建一个不执行任何操作或进行一些清理的 exit()
函数的替代品。这只是一个想法,我还没有尝试过,但它可以帮助您解决问题。
关于c++ - 如何覆盖 exit(),可能是通过抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25069195/