假设我跑命令执行程序并 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
运行此程序时,只要我标记要复制的区域,屏幕就会停止滚动