加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 库覆盖信号处理程序,但我需要清理CTRL C

发布时间:2020-12-16 07:17:17 所属栏目:百科 来源:网络整理
导读:我编写了一个终端应用程序,它使用由设计糟糕的库控制的设备来覆盖SIGINT(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完成.

解决方法

大多数情况下,你运气不好,除非你发现像 using LD_PRELOAD这样的肮脏技巧来覆盖信号或sigaction行为,当你可以合理地推断你在坏库中时.

但是,您可以在单独的进程中运行badLibraryCall,它是主进程的子进程.然后你的SIGINT陷阱可以收获它,根据需要杀死,并执行你需要做的任何清理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读