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

Laj*_*agy 117 unix bash

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

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

它是如何工作的?

Joh*_*lla 159

打破它,有三大块:

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

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

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

一个更人性化的版本看起来像这样:

kablammo() {             # Declaration
  kablammo | kablammo&   # The problematic body.
}; kablammo              # End function definition; invoke function.
Run Code Online (Sandbox Code Playgroud)

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

  • ......而且,kablammo! (9认同)
  • Minor nit:"函数被调用两次而实例被背景化"并不完全正确.该函数在管道中被调用两次,管道是后台的,因此两个实例都在后台运行.虽然这是一个语义细节,但事实上很可能只有一个被尝试过,并且它的递归会在另一个启动之前停止系统. (9认同)
  • @Dan:不太可能,因为它会在创建子进程后立即终止.你需要的最重要的成分是叉炸弹不会终止,因此进程总数会随着时间的推移而增长,而不是保持稳定. (7认同)
  • @william:"它的递归会在另一次启动之前暂停系统",那么这是否意味着:(){:&} ;:也可以作为炸弹工作? (4认同)
  • 当你的系统冒烟时,确保你没有爆炸! (2认同)

Tal*_*joe 9

简短回答:

冒号(":")成为一个函数,因此您运行管道函数并将其放入背景中,这意味着每次调用函数时都会调用2个函数副本.递归占据了一席之地.