c++ - 如何覆盖 exit(),可能是通过抛出异常

标签 c++ c

我们有一个第三方库,在编写时没有考虑多线程或异常处理。我们的主要可执行文件是多线程的并使用异常。

第三方库使用 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/

相关文章:

c++ - 我在 Mingw 中为 fcntl.h 和 unistd.h 链接了哪些库

c - 检索 apr_pool_tag 标签值

我可以在线程内接受()吗

C++ 在字符串中找不到 ";"

c - 使用 C 编程语言,制作多核 RedHat Linux 处理器的最佳方法是什么,在测试应用程序中仅使用一个内核?

c - 如何修复 C 中的致命运行时错误?

c - for循环在C中运行两次

c++ - 重载函数声明的顺序在 C++ 中重要吗?

c++ - 在 C++ 中编写复制构造函数和赋值运算符的 list

用于扫描的 C++ HTML 查看器?