流3句柄重定向导致输出洪泛

问题描述 投票:3回答:1

[我在使用此命令时正在玩wmic

wmic<nul 3>nul

产生此:

奇怪的是,any命令将起作用,但只有流3会导致输出泛洪。我在SO“ cmd输出洪水”中进行了搜索和搜索,找不到任何重复项或任何结果。问题:为什么只有流3有效?

windows batch-file cmd io-redirection
1个回答
0
投票
请参考它们的内在细节,此答案只是用于解释不同行为的摘要。

    创建重定向后,处理此任务的cmd中的代码将尝试避免将原始句柄保存到要重定向的流中的问题,以便可以还原重定向过程。
  • 但是使用的功能(标准_dup())的工作方式以及创建重定向时所使用的顺序可能会更改内部结构,从而最终使反向代码转换使用错误的信息。

  • 简而言之:

    <nul 3<nul wmic

    [<nulstdin句柄保存在&3中,并将nul流分配给&0
    • [3<nul&3中的句柄保存到&4并将nul流分配给&3
    • wmic被执行。当它从nul(分配给&0)读取时,它无法读取任何内容并结束。
    • [&0从保存它的&3恢复,但是现在&3指向nul
    • &3&4恢复。现在它指向原始的stdin
  • 在最初的aschipfl问题中,观察到的行为是命令提示符关闭。执行代码后
  • < file1 3< file2 echo/

    重定向取消过程使stdin流指向磁盘文件。 cmd开始读取此文件以执行命令(通常从stdin开始执行),并且在文件末尾,读取操作失败,cmd实例结束。如果您想用复杂的方式启动记事本,可以尝试]

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

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

    <nul 3<nul echo/
    

    一旦执行命令并还原重定向,stdin流将与nul设备关联
    1. [cmd显示提示并尝试从nul中读取新的命令
    2. 读取操作结束但不检索任何内容,因此cmd不执行任何操作
    3. 转到2
  • 问题“
  • 为什么仅流3起作用?”(从某种意义上说不起作用;))是不正确的。你可以做类似的事情

    1>file1 <nul 4<nul echo/ 并使用不同的流获得相同的结果。或者你可以做

     3<nul <nul echo/
    

    并且它将起作用(就其意义而言)。

    请求流重定向的顺序,cmd内部代码如何处理流以及是否存在仍在活动的先前重定向确定了命令的成功或失败。
  • © www.soinside.com 2019 - 2024. All rights reserved.