windows - Stream 3 句柄重定向导致输出溢出

标签 windows batch-file cmd io-redirection

执行此命令时我正在玩 wmic

wmic<nul 3>nul

产生了这个:

奇怪的是,任何命令都可以工作,但只有流 3 导致输出泛滥。
我用谷歌搜索了 SO “cmd 输出泛滥”,找不到任何重复项或任何结果。
问题:为什么只流3个作品?

更新:同样,

>con 3<con :

完全禁用STDOUT!

最佳答案

我认为,as pointed通过 aschipfl,my answertheir question解释问题的根源是什么。

请引用他们的内部细节,这个答案只是解释不同行为的总结。

  • 创建重定向时,cmd 中的代码处理此任务会尝试避免将原始句柄保存到正在重定向的流中的问题,以便可以恢复重定向过程。

  • 但是所使用的函数(标准 _dup())的工作方式和创建重定向时使用的顺序可能会改变所使用的内部结构,最终反转重定向的代码会使用错误的信息。

简而言之:

<nul 3<nul wmic
  • <nul保存 stdin处理 &3并分配 nul流向 &0
  • 3<nul将句柄保存在 &3 中进入&4并分配 nul流向 &3
  • wmic被执行。因为它正在读取 nul (分配给 &0 )它无法读取任何内容并结束。
  • &0&3 恢复它保存在哪里,但现在 &3指向 nul
  • &3&4 恢复.现在它指向原来的stdin

在最初的 achipfl 问题中,观察到的行为是命令提示符关闭。代码执行后

< file1 3< file2 echo/

重定向取消进程离开 stdin流指向磁盘文件 ( file2 )。 cmd开始读取此文件以执行命令(因为它通常从 stdin 执行)并且在文件末尾读取操作失败并且 cmd实例结束。如果你想以一种复杂的方式看到它在工作中启动记事本,你可以尝试

( >file1 echo notepad ) & ( <nul 3<file1 break )

但在这个问题中,行为是不同的,因为分配给 &3 的流, 将被复制到 stdin一旦恢复重定向,就不是磁盘文件而是nul

<nul 3<nul echo/
  1. 一旦命令被执行并且重定向被恢复stdin流与 nul 相关联设备
  2. cmd显示提示并尝试检索从 nul 读取的新命令
  3. 读取操作结束但未检索任何内容,所以 cmd不执行任何操作
  4. 转到2

问题“为什么只有 stream 3 有效?”(从某种意义上说它无效 ;))是不正确的。你可以做类似的事情

1>file1 <nul 4<nul echo/

并使用不同的流得到相同的结果。或者你可以做

 3<nul <nul echo/

它会起作用(在它起作用的意义上)。

您请求流重定向的顺序,cmd 如何处理它们内部代码和仍然有效的先前重定向的存在可以决定命令的成功或失败。

关于windows - Stream 3 句柄重定向导致输出溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61934916/

相关文章:

c++ - 在 wxwidgets 中,如何让一个线程在继续之前等待另一个线程完成?

batch-file - 如何将 html 作为参数传递给批处理程序?

windows - 在 Windows 上获取当前登录的用户

c++ - 根据文本动态调整控件大小

c - 在 Windows 静态库中查找 undefined symbol

windows - 是否有适用于 Windows 的 HTTP Live Streaming 客户端?

batch-file - 如何在批处理文件中实现删除代码?

用于将 IP 地址批量转换为 CIDR 的 Bash 脚本?

windows - 以管理员身份执行时如何在批处理文件中捕获 powershell 脚本的错误级别

python - 在后台运行基于 GUI 的应用程序的 .exe