如何覆盖exit(),也许是通过抛出异常

Mar*_*ata 8 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);
}
Run Code Online (Sandbox Code Playgroud)

并在我的代码中捕获异常.它似乎有效,但这显然是一种黑客行为,而不是大自然打算exit()使用的方式.不知道我做错了什么?

编辑

许多人建议我把它放在一个单独的过程中,但这会打败很多东西.第三方库执行非常高速的数据传输,需要在主应用程序进程中,因为它位于相同的虚拟内存空间中,不用于malloc从作为控制器的FPGA协处理器分配内存.这段代码接近"铁",并且正在挤压内存和PCIe总线的每一点带宽.

编辑2

我的程序仍可以返回状态代码与返回值的OS int main(),这并没有最终调用exit().否则我会遇到麻烦.

Ort*_*ier 1

这只是一个想法,但是您可以使用与我需要包装以使用某些不同版本时类似的方法,请在此处memcpy查看我的答案。

因此,您可以构建一个exit()不执行任何操作的函数的替代品,或者进行一些清理。这只是一个想法,我还没有尝试过,但它可以帮助你解决你的问题。