【问题标题】:What is %0|%0 and how does it work?什么是 %0|%0,它是如何工作的?
【发布时间】:2012-11-06 08:21:29
【问题描述】:

如果您运行带有%0|%0 的 .bat 或 .cmd 文件,您的计算机开始使用大量内存,并在几分钟后重新启动。为什么此代码会阻止您的 Windows?这段代码以编程方式做了什么?会不会是“bug”?

【问题讨论】:

    标签: windows command-line


    【解决方案1】:

    %0 永远不会结束,但它永远不会创建多个进程,因为它会立即将控制权转移到第二个批处理脚本(恰好是它自己)。

    但是,除了父进程之外,Windows 管道还会为管道的每一端创建一个新进程。直到管道的每一侧终止,父进程才能完成。所以带有简单管道的主程序将有 3 个进程。如果管道的每一端都递归地调用父批次,你可以看到炸弹是如何迅速失控的!

    【讨论】:

    【解决方案2】:

    这是fork bomb 的 Windows 版本。

    %0 是当前正在执行的批处理文件的名称。只包含这一行的批处理文件:

    %0|%0
    

    将永远递归执行自身,快速创建许多进程并减慢系统速度。

    这不是windows中的错误,只是在批处理文件中做的一件非常愚蠢的事情。

    【讨论】:

    • 为什么 %0|%0 会破坏窗口,而 %0 不会?
    • @Pavel:.bat 文件的作用是:读取指令,在文件末尾终止。如果你运行 %0:进程 1:启动,运行 %0(从而创建进程 2);然后死进程 2:启动,运行 %0(从而创建进程 3);然后死 [...] 你最多只能运行 2 个进程,因为创建者会死。分叉炸弹的重点是创建2个版本。因此 P1 创建 2 个进程(1' 和 1"),这两个进程将创建,每个,2(因此 4),呈指数增长。
    【解决方案3】:

    这被称为叉形炸弹。 它不断分裂,直到别无选择,只能重新启动系统。 http://en.wikipedia.org/wiki/Fork_bomb

    【讨论】:

    • @RohanGala: $0; $0(在 bash 和 zsh 中工作,在 Ubuntu 14.04 上测试)
    • 请注意,您可以使用 ⌃C 停止它,您需要忽略 SIGINT 或分离以防止这种情况。 (:
    • :(){ :|:& };: 是一个版本
    【解决方案4】:

    这是一个逻辑炸弹,它不断地重新创建自己并占用你所有的 CPU 资源。它使您的计算机因过多的进程而过载,并迫使它关闭。如果您在其中创建一个批处理文件并启动它,您可以使用 taskmgr 结束它。您必须非常快地完成此操作,否则您的计算机将太慢而无法执行任何操作。

    【讨论】:

      【解决方案5】:

      它是什么:

      %0|%0fork bomb。它将使用管道| 生成另一个进程,该管道异步运行同一程序的副本。这会占用 CPU 和内存,使系统减速到几近停止(甚至使系统崩溃)。

      这是如何工作的:

      %0 指的是用来运行当前程序的命令。例如,script.bat

      管道| 符号将使第一个命令序列的输出或结果作为第二个命令序列的输入。在叉子炸弹的情况下,没有输出,所以它会简单地运行第二个命令序列而没有任何输入。

      扩展示例,%0|%0 可能意味着 script.bat|script.bat。这会再次运行自己,但也会创建另一个进程来再次运行相同的程序(没有输入)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多