gpt4 book ai didi

c++ - 库会覆盖信号处理程序,但我需要按 CTRL+C 进行清理

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:15:23 25 4
gpt4 key购买 nike

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

这是我尝试过的:

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 完成。

最佳答案

大多数情况下你运气不好,除非你玩像 using LD_PRELOAD 这样的肮脏把戏。当您可以合理地推断您在错误的库中时,覆盖 signalsigaction 行为。

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

关于c++ - 库会覆盖信号处理程序,但我需要按 CTRL+C 进行清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38976324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com