我在 Win XP 上通过命令行 (devenv.exe /rebuild) 在 Visual Studio 2005 中运行软件构建。我通过管道将其传输到 more,然后意识到我不想照看它,所以我用 Q 退出了 more。现在我在 CMD 窗口中看不到任何内容。命令是否正常运行,more 是否只是缓冲并显示 STDOUT,并且它会继续运行,尽管 more 已退出,还是这个构建现在永远无法完成?
答案1
有趣的问题!
您通过管道传输到 MORE 的进程将继续运行,直到其自然完成或您将其终止。以下测试可展示这一点:
打开 2 个 cmd 窗口。
在提示符下运行:ping -n 120 127.0.0.1 | more
在提示符下运行:tasklist | findstr /I ping
ping 将运行大约 120 秒,但使用标准 cmd 窗口将在更短的时间内达到满页(相应地调整 ping 命令)。
您可以在第二个提示中显示,无论您是否使用“Q”终止 MORE,PING 都会继续运行。只有使用 ctrl+C 完全终止 PING 命令,或等待整整 50 秒,ping 才会停止。
答案2
是的,more
即使您不滚动输出,缓冲区和进程仍会继续运行。
但是,如果你more
提前退出,nonexistent pipe
错误做在某些情况下会出现这种情况。这似乎不会影响执行,很可能是由于所使用的测试方法。
我们可以用一个简单的批处理文件来测试:
@echo off
for /l %%a in (1,1,100) do echo %%a
msg * done
通过将其放入管道中more
,很明显无论是否more
滚动,该过程都会继续执行:我们done
无需前进就能看到消息more
。
但是,如果我们像这样增加运行时间,并more
在q
命令中间退出:
@echo off
for /l %%a in (1,1,10000) do echo %%a
msg * done
我们收到很多错误消息:
The process tried to write to a nonexistent pipe.
消息框仍然出现。使用简单的 C# 或 C 程序重新测试不会复制此行为。我的猜测是,如果流已经打开,它将照常进行(无输出) - 但echo
上述测试中使用的命令实际上每次都尝试重新打开流,一旦管道目标关闭,就不再可能了。