如果我在 cmd 窗口中单击,它到底会做什么?

如果我在 cmd 窗口中单击,它到底会做什么?

假设我跑命令执行程序并 ping localhost。之后我再次 ping localhost,但我点击窗口,ping 停止,直到我按进入

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

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

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

编辑:进一步澄清:我知道我正在使用“快速编辑”,按 Enter 键会复制我选择的内容。我不知道后台发生了什么。

在此处输入图片描述

答案1

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

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

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

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

答案2

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

当然,只要只有一个线程,这基本上与冻结进程相同。因为单个线程会尝试在执行更多工作之前写入一些输出。

如果我运行ping -t localhost并单击命令提示符窗口,然后我就可以使用ping.exe以下命令检查主线程的调用堆栈进程探索器

在此处输入图片描述

我们可以看到它ping.exe试图写入一些输出。它调用了write()C 运行时库。该函数在某个时候调用获取控制台模式看起来,该函数将检查用户当前是否处于标记模式,并在必要时阻止执行。

更深入的分析

ping我们可以通过检查以下行为来进一步证明这一行为:Wireshark

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

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

但我们已经知道了...

好的,让我们看看输出是否是实际上问题就在这里!让我们将输出定向到设备NUL

在此处输入图片描述

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

在此处输入图片描述

答案3

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

通常,仅当您右键单击黑屏并选择标记时,CMD 才会进入编辑模式。

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

答案4

当您从窗口中选择要复制的文本时(处于Mark模式时),系统会暂停该窗口中的当前进程。

批处理文件示例:

:test
echo %0
goto test

运行此程序时,只要我标记要复制的区域,屏幕就会停止滚动

相关内容