我有一个控制台模式的Windows应用程序(从Unix移植),最初设计为在收到^ C(Unix SIGINT)时执行干净退出。在这种情况下,干净的退出可能需要等待很长一段时间才能关闭远程网络连接。 (我知道这不是^ C的正常行为,但是我无法更改它。)该程序是单线程的。

我可以使用signal(SIGINT)(在Unix下)或 SetConsoleCtrlHandler 捕获^ C。在CMD.EXE下运行该程序时,两种方法均能正常工作。但是,如果我使用MSYS附带的“bash” shell 程序(我正在使用MinGW环境来构建程序,因为这使我可以重用Unix makefile),那么该程序将被强制终止一段时间,时间较短(少于^ C之后的100毫秒)。这是 Not Acceptable ,因为如上所述,该程序需要等待远程网络连接关闭。

人们很可能希望在MSYS bash下运行该程序。同样,这种效果破坏了测试套件。我无法从程序内部(理想)或通过 shell 上的设置(可接受)找到解决该问题的任何方法。谁能推荐什么?

最佳答案

这可能是由于臭名昭著的mintty "Input/Output interaction with alien programs"问题(又名mintty issue #56)引起的。在这种情况下,它表现为Ctrl-C突然杀死程序,而不是作为捕获和处理的信号传递给程序。该理论的证据基于zwol的广泛解释:“控制台模式Windows应用程序”,“[应用程序被设计为在收到^ C时执行干净退出”,“[应用程序]在CMD下运行程序时可以正常工作.EXE”,但“[MSYS程序附带的[使用终端时]被强行终止”(在撰写本文时(2018年),MSYS默认使用mintty作为其终端)。

不幸的是,mintty isn't a full Windows console replacement和“ native ” Windows程序预期的各种行为均未实现。但是,当在mintty中运行此类 native 程序时,将它们包装在winpty中可能会带来一些乐趣...

其他问题也描述了此行为:请参见https://superuser.com/questions/606201/how-to-politely-kill-windows-process-from-cygwinhttps://superuser.com/questions/1039098/how-to-make-mintty-close-gracefully-on-ctrl-c

10-08 05:12