这个bash fork炸弹是如何工作的?

时间:2009-06-13 17:45:02

标签: bash unix

根据维基百科,以下是一款非常优雅的bash fork炸弹:

:(){ :|:& };:

它是如何运作的?

2 个答案:

答案 0 :(得分:159)

打破它,有三大块:

:()      # Defines a function, ":". It takes no arguments.
{ ... }; # The body of the function.
:        # Invoke the function ":" that was just defined.

在正文内部,函数被调用两次,管道被背景化;对进程的每次连续调用都会产生更多的“:”调用。这导致系统资源迅速消耗,使事情陷入停顿。

请注意,调用它一次,无限递归,就不够好了,因为这只会导致原始进程的堆栈溢出,这很麻烦但可以处理。

更人性化的版本如下所示:

kablammo() {             # Declaration
  kablammo | kablammo&   # The problematic body.
}; kablammo              # End function definition; invoke function.

编辑:下面威廉的评论是我上面所说的更好的措辞,所以我编辑了这个建议。

答案 1 :(得分:9)

简短回答:

冒号(“:”)成为一个函数,因此您运行管道函数并将其放入背景中,这意味着每次调用函数时都会调用2个函数副本。递归就掌握了。