【发布时间】:2012-11-06 08:21:29
【问题描述】:
如果您运行带有%0|%0 的 .bat 或 .cmd 文件,您的计算机开始使用大量内存,并在几分钟后重新启动。为什么此代码会阻止您的 Windows?这段代码以编程方式做了什么?会不会是“bug”?
【问题讨论】:
标签: windows command-line
如果您运行带有%0|%0 的 .bat 或 .cmd 文件,您的计算机开始使用大量内存,并在几分钟后重新启动。为什么此代码会阻止您的 Windows?这段代码以编程方式做了什么?会不会是“bug”?
【问题讨论】:
标签: windows command-line
%0 永远不会结束,但它永远不会创建多个进程,因为它会立即将控制权转移到第二个批处理脚本(恰好是它自己)。
但是,除了父进程之外,Windows 管道还会为管道的每一端创建一个新进程。直到管道的每一侧终止,父进程才能完成。所以带有简单管道的主程序将有 3 个进程。如果管道的每一端都递归地调用父批次,你可以看到炸弹是如何迅速失控的!
【讨论】:
这是fork bomb 的 Windows 版本。
%0 是当前正在执行的批处理文件的名称。只包含这一行的批处理文件:
%0|%0
将永远递归执行自身,快速创建许多进程并减慢系统速度。
这不是windows中的错误,只是在批处理文件中做的一件非常愚蠢的事情。
【讨论】:
.bat 文件的作用是:读取指令,在文件末尾终止。如果你运行 %0:进程 1:启动,运行 %0(从而创建进程 2);然后死进程 2:启动,运行 %0(从而创建进程 3);然后死 [...] 你最多只能运行 2 个进程,因为创建者会死。分叉炸弹的重点是创建2个版本。因此 P1 创建 2 个进程(1' 和 1"),这两个进程将创建,每个,2(因此 4),呈指数增长。
这被称为叉形炸弹。 它不断分裂,直到别无选择,只能重新启动系统。 http://en.wikipedia.org/wiki/Fork_bomb
【讨论】:
$0; $0(在 bash 和 zsh 中工作,在 Ubuntu 14.04 上测试)
这是一个逻辑炸弹,它不断地重新创建自己并占用你所有的 CPU 资源。它使您的计算机因过多的进程而过载,并迫使它关闭。如果您在其中创建一个批处理文件并启动它,您可以使用 taskmgr 结束它。您必须非常快地完成此操作,否则您的计算机将太慢而无法执行任何操作。
【讨论】:
%0|%0 是 fork bomb。它将使用管道| 生成另一个进程,该管道异步运行同一程序的副本。这会占用 CPU 和内存,使系统减速到几近停止(甚至使系统崩溃)。
%0 指的是用来运行当前程序的命令。例如,script.bat
管道| 符号将使第一个命令序列的输出或结果作为第二个命令序列的输入。在叉子炸弹的情况下,没有输出,所以它会简单地运行第二个命令序列而没有任何输入。
扩展示例,%0|%0 可能意味着 script.bat|script.bat。这会再次运行自己,但也会创建另一个进程来再次运行相同的程序(没有输入)。
【讨论】: