如果我在cmd的窗口中点击它到底有什么作用?

Ada*_*old 54 windows-7 command-line

假设我运行cmd.exe并 ping localhost。之后我再次 ping localhost 但我点击进入窗口并且 ping 停止,直到我按下enter

当我点击窗口时会发生什么?它是暂停进程还是其他什么?我附上了一张截图来澄清这个问题。

注意:我实际上并没有单击而是使用鼠标拖动,这会在窗口中创建一个白框,如屏幕截图所示。

编辑:进一步澄清:我真正想知道的是拖动窗口是否会停止 cmd 进程?

编辑:更多说明:我知道我正在使用快速编辑并按 Enter 复制我选择的内容。我不知道的是后台会发生什么。

在此处输入图片说明

Der*_*ler 60

单击“命令提示符”窗口后,控制台主机将不再允许写入输出。应用程序本身继续运行,但没有任何内容写入屏幕。

当然,只要只有一个线程,这和你的进程被冻结基本是一样的。由于单线程尝试在做更多工作之前写一些输出。

如果我运行ping -t localhost并单击进入命令提示符窗口,则可以ping.exe使用Process Explorer检查主线程的调用堆栈。

在此处输入图片说明

我们可以看到ping.exe试图写一些输出。它write()在 C 运行时库中调用。该函数有时会调用GetConsoleMode。看起来,该函数将检查用户当前是否处于标记模式并在需要时阻止执行。

进一步分析

我们可以通过检查pingwith Wireshark的行为来进一步证明这种行为

运行时,ping -t superuser.com我们在 Wireshark 中看到以下输出:
在此处输入图片说明

现在,让我们在命令提示符中标记一个框。
在此处输入图片说明
突然间,Wireshark 中不再有 ping 记录。ping不再发送任何数据包。

但我们已经知道...

是的,让我们看看输出是否真的是这里的问题!让我们将输出定向到NUL设备:

在此处输入图片说明

现在,不再有任何输出。我们现在可以整天在框中标记文本,数据包将记录在 Wireshark 中。

在此处输入图片说明


Joh*_*hnL 29

当您在 cmd.exe 窗口中选择一些文本时,该进程将在后台继续进行,直到下次写入标准输出(或 STDOUT,即 cmd.exe 窗口中显示的数据流)。

当您退出选择模式时,该过程将恢复正常。

您可以通过ping www.google.com -t在 cmd.exe 窗口中键入内容并选择输出的某些区域来测试这一点。您会看到它暂停,当您取消选择时,输出将恢复。

编辑:根据 Fran 的评论,您可以使用诸如 Wireshark 之类的工具来查看在您进行选择后仍会发生活动,然后停止。

  • 仅此而已并不能对其进行测试。您还需要运行 Wireshark 并查看 ICMP 数据包是否停止发送。如果是这样,那么该过程被暂停是正确的。如果没有,进程不会被挂起,输出只是被缓冲(直到缓冲区填满,然后它会被挂起或数据将丢失)。 (3认同)
  • @Zitrax 是的,这就是您可以防止意外发生的方法。我经常从我的命令窗口复制东西,所以我不这样做。(好吧,实际上我使用 [Consolez](https://github.com/cbucher/console) 没有这个问题) (2认同)
  • 这称为“_blocking_”...即:应用程序调用`write()`,但它被卡住了。 (2认同)

小智 6

那是因为窗口进入了标记模式。当您按下 Enter 键时,它会将选定的文本复制到剪贴板。据我所知,没有对此进行设置,所以当您单击窗口时,我不确定为什么会这样做。通常,您必须右键单击并点击“标记”。检查以确保没有键卡在键盘上。

  • 该设置称为快速编辑模式。单击左上角的图标,选择“属性”,然后在“选项”选项卡上选择“快速编辑模式”。据我所知,该过程将在后台继续进行,直到需要与控制台进行交互,此时它将阻塞 (9认同)

小智 6

您的 CMD 窗口处于快速编辑模式,当您单击屏幕时会自动进入编辑模式。Enter 用于复制白框中的文本并退出编辑模式。

通常CMD只有在黑屏上右击选择Mark时才会进入编辑模式。

要恢复正常,请右键单击窗口的标题栏并选择“属性”,选择“选项”选项卡并取消选择“快速编辑模式”,然后单击“确定”。