库覆盖信号处理程序,但我需要在CTRL+C上清理

Library overwrites signal handler, but I need to clean up on CTRL+C

本文关键字:CTRL+C 信号处理 覆盖 程序      更新时间:2023-10-16

我编写了一个终端应用程序,该应用程序使用由一个设计糟糕的库控制的设备,该库覆盖了SIGINT (CTRL+C)。我的目标是使用该库正确地使用设备,但我希望能够通过一些清理来很好地关闭应用程序。(否则,我将不遵循我所连接的其他设备的协议,并且在再次运行程序时无法重新连接)

这是我尝试的:

std::atomic< bool > globalQuit(false);
void signalHandler(int signal)
{
    globalQuit = true;
}
int
main(int argc, char** argv)
{
    std::signal(SIGINT, signalHandler);
    badLibraryCall();
    while (!globalQuit)
    {
        badLibraryCall();
    }
    doCleanUp();
    return 0;
}

但是,当我按CTRL+C时,调用badLibraryCall中注册的不同的signalHandler并退出。没有好的doCleanUp完成

大多数情况下你都不走运,除非你玩了一些肮脏的把戏,比如当你可以合理地推断你在坏库中时,使用LD_PRELOAD来覆盖signalsigaction行为。

但是,您可能能够在一个单独的进程中运行badLibraryCall,该进程是主进程的子进程。然后,您的SIGINT捕获可以收获它,根据需要杀死它,并执行您需要执行的任何清理操作。