防止MSYS'bash'杀死捕获^ C的进程

zwo*_*wol 33 c windows portability windows-console

我有一个控制台模式的Windows应用程序(从Unix移植),最初设计用于在收到^C(Unix SIGINT)时进行干净退出.在这种情况下,干净的出口涉及等待,可能相当长的时间,以便关闭远程网络连接.(我知道这不是正常行为,^C但我无法改变它.)该程序是单线程的.

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

人们很可能想要在MSYS bash下运行这个程序.此外,这种效果打破了测试套件.我无法找到任何方法来解决问题,无论是从程序内(理想)还是通过shell上的设置(可接受).谁能推荐任何东西?

小智 7

我有完全相同的问题 - 我用SIGINT/SIGTERM处理程序编写了一个程序.该处理程序进行了清理工作,有时需要一段时间.当我从msys bash中运行程序时,ctrl-c将导致我的SIGINT处理程序触发,但它无法完成 - 程序在完成清理之前终止("从外部",因为它)工作.

基于phs的答案,以及对类似问题的回答:https://stackoverflow.com/a/23678996/2494650,我提出了以下解决方案.它非常简单,它可能有一些我尚未发现的副作用,但它解决了我的问题.

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

trap '' SIGINT
Run Code Online (Sandbox Code Playgroud)

而已.这会捕获sigint信号并阻止msys bash"从外部"终止你的程序.但是,它仍以某种方式让SIGINT信号通过你的程序,允许它进行优雅的清理/关闭.我无法确切地告诉你为什么它以这种方式工作,但确实如此 - 至少对我而言.

祝好运!


Ano*_*non 2

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

不幸的是,mintty 并不是一个完整的 Windows 控制台替代品,并且“本机”Windows 程序所期望的各种行为也没有实现。然而,当在 mintty 中运行此类本机程序时,您可能会喜欢将这些本机程序包装在winpty中......

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