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

防止MSYS的bash’杀死陷阱^ C的进程

发布时间:2020-12-15 09:17:09 所属栏目:安全 来源:网络整理
导读:我有一个控制台模式Windows应用程序(从Unix移植),它最初设计为在接收^ C(Unix SIGINT)时执行一个干净的退出。在这种情况下,干净的退出涉及等待,可能相当长的时间,用于远程网络连接关闭。 (我知道这不是^ C的正常行为,但我不能改变它的位置。)程序是单线
我有一个控制台模式Windows应用程序(从Unix移植),它最初设计为在接收^ C(Unix SIGINT)时执行一个干净的退出。在这种情况下,干净的退出涉及等待,可能相当长的时间,用于远程网络连接关闭。 (我知道这不是^ C的正常行为,但我不能改变它的位置。)程序是单线程的。

我可以用任一信号(SIGINT)(如在Unix下)或用SetConsoleCtrlHandler捕获^ C。当程序在CMD.EXE下运行时,两种方法都能正常工作。但是,如果我使用MSYS附带的“bash”shell(我使用MinGW环境来构建程序,因为这允许我重用Unix makefile),那么程序被强制终止一些随机,短时间100毫秒)后^ C。这是不可接受的,因为正如我所提到的,程序需要等待远程网络连接关闭。

很可能人们会想在MSYS bash下运行这个程序。此外,此效果打破了测试套件。我没有找到任何办法解决这个问题,无论是从程序(理想的)或通过shell上的设置(可接受)。任何人都可以推荐什么?

我有完全相同的问题 – 我写了一个程序与SIGINT / SIGTERM处理程序。这个处理程序做了清理工作,有时需要一段时间。当我从msys bash中运行程序时,ctrl-c会导致我的SIGINT处理程序启动,但它不会完成 – 该程序在它可以完成清理之前(“从外部”终止)工作。

基于phs的答案,这个回答一个类似的问题:http://stackoverflow.com/a/23678996/2494650,我想出了以下解决方案。它疯了简单,它可能有一些副作用,我还没有发现,但它解决了我的问题。

使用以下行创建?/ .bashrc文件:

trap '' SIGINT

而已。这会捕获sigint信号,并防止msys bash从“外部”终止您的程序。但是,它仍然让SIGINT信号通过你的程序,允许它做优雅的清理/关闭。我不能告诉你为什么它这样工作,但它确实 – 至少对我来说。

祝你好运!

(编辑:李大同)

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

    推荐文章
      热点阅读