:(){:|:&};: 这个 BASH 叉子炸弹具体是如何工作的?

:(){:|:&};: 这个 BASH 叉子炸弹具体是如何工作的?

我对 shell、子 shell、函数、后台进程的了解非常零碎,因此我对理解这个 fork 炸弹的详细工作原理缺乏信心,

不过我告诉你我所知道的:

  • :() 这里的冒号只是一个看起来不寻常的函数名
  • {...} 这里描述了该函数正在做什么
  • {:()} 这里函数调用自身的下一次迭代
  • {:()&} 这里函数调用自身并将自身的下一次迭代放入 shell 的后台
  • ...;: 最后一个冒号是函数实际执行的起点,前面的只是它的定义

所以,我的基本理解是,它是一个递归函数,它的工作原理就像一个产卵机,产卵自身的副本,直到系统无法再增殖社会福利为止。

但是,我并没有真正以视觉方式理解正在一步一步发生的事情。

例如

  • :()|:()& 为什么两个函数调用都通过管道符号组合在一起?
  • 分叉炸弹是否以线性方式产生,每个时间单位的进程数恒定,或者它是否像两个函数调用所暗示的那样呈指数性增长。

有人可以另外提供一幅产卵过程的一步一步的视觉漫画吗,无论多么马虎?

答案1

这是一个直观的解释;抱歉,这不是漫画,但它应该说明:

  • 第 1 步:运行函数

    :
    
  • 步骤 2:该函数运行其自身的两个副本,使用管道并行启动两个副本(后台操作符在这里似乎并不重要,如答案中所述叉式炸弹如何工作?

    (:|:)
    

    (为了清楚起见,我在这里使用括号)

  • 步骤 3:对每个重复该过程:

    ((:|:)|(:|:))
    
  • 所以它继续

    (((:|:)|(:|:))|((:|:)|(:|:)))
    

    等等,在每一步都替换:(:|:)

    ((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))
    
    (((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:)))))
    
    ((((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:)))))|(((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))))
    

等等,直到系统耗尽资源(此时它确实会变得非常无响应)。

相关内容