库覆盖信号处理程序,但我需要在CTRL+C上清理
Library overwrites signal handler, but I need to clean up on CTRL+C
我编写了一个终端应用程序,该应用程序使用由一个设计糟糕的库控制的设备,该库覆盖了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来覆盖signal
或sigaction
行为。
badLibraryCall
,该进程是主进程的子进程。然后,您的SIGINT捕获可以收获它,根据需要杀死它,并执行您需要执行的任何清理操作。
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 有可能在信号处理程序中设置promise吗
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 调试和自由执行中的信号处理
- 通过安装信号处理程序关闭多线程应用程序
- 为什么我的信号处理程序只执行一次?
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- C++ 在信号处理程序后继续执行
- 没有信号处理程序的POSIX定时器的目的是什么?
- 为什么这个信号处理程序不能捕获 SIGHUP 或 SIGQUIT?
- 如何在C++中使用 std::bind 函数作为信号处理程序?
- 在 C++17 中,是否未定义使用无锁原子学保护从信号处理程序传递的数据?
- 如何将信号处理程序添加为方法
- 窗口上信号处理程序的异步安全写入函数
- 使用信号处理程序处理从 FIFO 接收的数据
- gtkmm/glade - 将信号处理程序连接到 MenuShell
- GTK+3 编译错误"找不到信号处理程序",您是否使用 -rdynamic 进行了编译?
- Linux 中的信号处理程序使用 sigaction (C++)
- 库覆盖信号处理程序,但我需要在CTRL+C上清理