叉形炸弹背后的历史是什么?

kas*_*vnd 6 linux cpu history fork

我已经阅读了有关其功能的其他问题——分叉炸弹通过在分叉过程中消耗 CPU 时间和使操作系统的进程表饱和来运行。

分叉炸弹的基本实现是一个无限循环,它重复启动相同的进程。

但我真的很想知道:这个命令的故事是什么?为什么是这个:(){ :|:& };:而不是另一个?

Ram*_*esh 15

这不是什么新鲜事。它的历史可以追溯到 1970 年代,当时它被引入。

这里引用,

最早对叉形炸弹的描述之一是 1969 年在华盛顿大学的 Burroughs 5500 上。它被描述为一个名为 RABITS 的“黑客”,它在运行时会复制自己的两个副本,这两个副本会生成两个每个副本更多,副本将继续制作更多副本,直到内存已满,从而导致系统崩溃。问 The Misanthrope 于 1972 年 7 年级时使用 BASIC 编写了一个类似兔子的程序。耶鲁大学的 Jerry Leichter 描述了在他的普林斯顿母校听到类似于兔子或叉形炸弹的程序,并说考虑到他的毕业日期,它们必须来自1973 年或更早。一个可追溯到 1974 年的帐户描述了一个实际名为“rabbit”的程序,该程序在一家大公司的 IBM 360 系统上运行,一名年轻员工因运行该程序而被解雇。

所以这:(){ :|:& };:只是在shell中实现fork炸弹的一种方式。如果你使用其他编程语言,你也可以用这些语言来实现。例如,在 python 中,你可以实现 fork 炸弹,

 import os
 while True: 
 os.fork()
Run Code Online (Sandbox Code Playgroud)

可以从维基百科链接中找到以不同语言实现分叉炸弹的更多方法。

如果您想了解语法,它非常简单。shell 中的正常函数看起来像,

foo(){
 arg1=$1
 arg2=$2
 echo 'Bar..'
 #do_something on $arg argument
}
Run Code Online (Sandbox Code Playgroud)

fork() 炸弹定义如下:

:(){
 :|:&
};:
:|:
Run Code Online (Sandbox Code Playgroud)

:|:- 接下来,它将使用称为递归的编程技术调用自身,并将输出通过管道传递给函数的另一个调用:。最糟糕的部分是函数被调用两次来轰炸你的系统。

& - 将函数调用置于后台,因此孩子根本不会死亡并开始吃系统资源。

; - 终止函数定义

: - 调用(运行)该函数,也就是设置 fork() 炸弹。

这是更多人类可读的代码:

bomb() {
 bomb | bomb &
}; bomb
Run Code Online (Sandbox Code Playgroud)

参考

http://www.cyberciti.biz/faq/understanding-bash-fork-bomb/