我编写了一个终端应用程序,它使用由设计糟糕的库控制的设备来覆盖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完成.
最佳答案 大多数情况下,你运气不好,除非你发现像
using LD_PRELOAD这样的肮脏技巧来覆盖信号或sigaction行为,当你可以合理地推断你在坏库中时.
但是,您可以在单独的进程中运行badLibraryCall,它是主进程的子进程.然后你的SIGINT陷阱可以收获它,根据需要杀死,并执行你需要做的任何清理.