我有一个控制台模式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处理程序启动,但它不会完成 – 该程序在它可以完成清理之前(“从外部”终止)工作。
原文链接:/bash/389700.html基于phs的答案,这个回答一个类似的问题:http://stackoverflow.com/a/23678996/2494650,我想出了以下解决方案。它疯了简单,它可能有一些副作用,我还没有发现,但它解决了我的问题。
使用以下行创建〜/ .bashrc文件:
trap '' SIGINT
而已。这会捕获sigint信号,并防止msys bash从“外部”终止您的程序。但是,它仍然让SIGINT信号通过你的程序,允许它做优雅的清理/关闭。我不能告诉你为什么它这样工作,但它确实 – 至少对我来说。
祝你好运!