命令提示符中的QuickEdit模式如何以及为何冻结应用程序?

时间:2015-05-24 00:21:50

标签: windows cmd signals

我最近遇到了Windows上的命令提示符问题,其中启用了QuickEdit模式,单击窗口选择文本并挂起正在运行的程序。这显然是已知的行为 - 我发现了一些与之相关的问题:

应用程序如何暂停" /"暂停"?该过程是否类似于* nix上的SIGSTOP信号? (我也有兴趣了解为什么这个功能首先存在?看起来不直观且危险。)

2 个答案:

答案 0 :(得分:47)

这非常符合设计。当程序不断滚动控制台窗口的内容时,用户无法选择文本。因此,控制台宿主程序只是停止读取stdout / stderr输出,程序会挂起,直到用户完成操作。这可以更改,您必须致电Get+SetConsoleMode()并关闭ENABLE_QUICK_EDIT_MODE选项。

注意这个"挂起"当程序以远高于控制台主机可以使用它的速率生成stdout输出时,您所获得的执行暂停与根本不同。虽然这些延误是有限的。

并且它不是用户停止程序的唯一方式,他也可以简单地按Ctrl + S.按Ctrl + Q会再次恢复。如果您的年龄足够大,那么您可能会将这些控制代码识别为Xon/Xoff,即终端的握手字符。这就是控制台的真正含义,是对终端的简单模拟,就像它们在20世纪70年代的使用方式一样。这也可以改变,你必须停止依赖内置的缓冲控制台输入并切换到ReadConsole()。或者通过关闭ENABLE_LINE_INPUT控制台选项,不确定自从您没有提及任何语言运行时的副作用,您必须尝试。

当然,终止你的程序非常容易。当用户键入Ctrl + Z时,您将在stdin上获得EOF,这应该结束您的程序。无论您的程序在做什么,都可以通过Ctrl + C和Ctrl + Break进行即时终止。您可以使用SetConsoleCtrlHandler()获取相关通知,但无法阻止。

如果默认行为危险并冒着人类健康的风险,那么我强烈建议您聘请顾问。并且不知道是谁写了这个答案。

答案 1 :(得分:0)

要回答我最近是如何在python脚本中调试相同问题并使用windbg捕获堆栈跟踪的。

对WriteConsole的调用最终会导致NtDeviceIoControlFile syscall,并且只有在发生按键或更改QuickEdit模式后内核才会返回。因此,如果您从不写入控制台,则可以避免冻结QuickEdit模式。您的用户将永远不需要复制任何内容。那么,再等一下QuickEdit模式是什么?