命令提示符中的快速编辑模式如何以及为什么会冻结应用程序?

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

应用程序如何“暂停”/“暂停”?进程是否类似于 * nix 上的 SIGSTOP信号?(我也有兴趣了解 为什么这个功能的存在摆在首位?这似乎不符合直觉,而且很危险。)

34783 次浏览

这完全是设计好的。当程序不断滚动控制台窗口的内容时,用户无法合理地选择文本。所以控制台主机程序只是停止读取 stdout/stderr 输出,程序挂起,直到用户完成操作。这可以更改,您必须调用 获取 + SetConsole 模式()并关闭 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 用于即时终止,不管程序正在做什么。你可以通过 SetConsole CtrlHandler ()得到这些通知,但是你不能阻止它。

如果默认行为是 很危险并且危及人类的健康,那么我强烈建议你雇佣一个顾问。也不知道是谁写的这个答案。

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

对 WriteConsole 的调用最终会导致 NtDeviceIoControlFile 系统调用,并且直到发生按键操作或者更改了 QuickEdit 模式,内核才会返回。因此,如果您从未写入控制台,您的进程就不会受到快速编辑模式冻结的影响。您的用户将永远不需要复制任何东西。那么,快速编辑模式是用来做什么的呢?