【发布时间】:2011-10-28 11:13:37
【问题描述】:
我有一个控制台模式 Windows 应用程序(从 Unix 移植),它最初设计为在收到 ^C (Unix SIGINT) 时执行干净退出。在这种情况下,一个干净的退出涉及等待,可能相当长的时间,以关闭远程网络连接。 (我知道这不是 ^C 的正常行为,但我无法更改它。)该程序是单线程的。
我可以使用signal(SIGINT)(在Unix 下)或SetConsoleCtrlHandler 来捕获^C。当程序在 CMD.EXE 下运行时,两者都可以正常工作。但是,如果我使用 MSYS 附带的“bash”外壳(我使用 MinGW 环境来构建程序,因为这允许我重用 Unix makefile),那么程序会被强制终止一些随机的短时间(少于^C 之后的 100 毫秒)。这是不可接受的,因为正如我所提到的,程序需要等待远程网络连接关闭。
人们很可能希望在 MSYS bash 下运行这个程序。此外,这种效果会破坏测试套件。我无法从程序内部(理想)或通过 shell 上的设置(可接受)找到解决问题的任何方法。谁能推荐点什么?
【问题讨论】:
-
您可以在 Windows 上随意使用
<signal.h>,但是当您在控制台窗口中键入 control-C 时,操作系统不会生成SIGINT,因此它对您没有任何好处。 -
有没有办法让网络连接更健壮?即使你正确处理程序关闭,如果有人绊倒电源线会发生什么?
-
<signal.h>在 Windows 上使用 Microsoft CRT 为我工作。当我在控制台窗口中键入 Ctrl+C 时,我使用signal()注册的处理程序会被SIGINT调用。 -
@Brian:实际上,我认为这是我的错误:请参阅stackoverflow.com/questions/7085604/… -- generating 来自另一个进程的 CTRL_C_EVENT 似乎在 kernel32 级别上不受支持,这让我觉得信号处理程序没有做任何建设性的事情。
-
@Zack 听起来你已经找到了答案——也许是时候结束这个问题了,这样像我这样的人就不会花时间试图回答它了? ;)
标签: c windows portability windows-console