我对 shell、子 shell、函数、后台进程的了解非常零碎,因此我对理解这个 fork 炸弹的详细工作原理缺乏信心,
不过我告诉你我所知道的:
- :() 这里的冒号只是一个看起来不寻常的函数名
- {...} 这里描述了该函数正在做什么
- {:()} 这里函数调用自身的下一次迭代
- {:()&} 这里函数调用自身并将自身的下一次迭代放入 shell 的后台
- ...;: 最后一个冒号是函数实际执行的起点,前面的只是它的定义
所以,我的基本理解是,它是一个递归函数,它的工作原理就像一个产卵机,产卵自身的副本,直到系统无法再增殖社会福利为止。
但是,我并没有真正以视觉方式理解正在一步一步发生的事情。
例如
- :()|:()& 为什么两个函数调用都通过管道符号组合在一起?
- 分叉炸弹是否以线性方式产生,每个时间单位的进程数恒定,或者它是否像两个函数调用所暗示的那样呈指数性增长。
有人可以另外提供一幅产卵过程的一步一步的视觉漫画吗,无论多么马虎?
答案1
这是一个直观的解释;抱歉,这不是漫画,但它应该说明:
第 1 步:运行函数
:
步骤 2:该函数运行其自身的两个副本,使用管道并行启动两个副本(后台操作符在这里似乎并不重要,如答案中所述叉式炸弹如何工作?)
(:|:)
(为了清楚起见,我在这里使用括号)
步骤 3:对每个重复该过程
:
((:|:)|(:|:))
所以它继续
(((:|:)|(:|:))|((:|:)|(:|:)))
等等,在每一步都替换
:
为(:|:)
((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:)))) (((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))) ((((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:)))))|(((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))))
等等,直到系统耗尽资源(此时它确实会变得非常无响应)。