<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">

<wml>
<head>
<meta http-equiv="cache-control" content="max-age=180,private" />
</head>
<card title="一条命令搞死电脑的Fork炸弹">
<p>
作者:<a href="index.php?action=showuser&amp;userid=1&amp;hash=">admin</a><br />时间:2015-03-11 14:05<br />分类:<a href="index.php?action=list&amp;cid=3&amp;hash=">电脑技术</a><br />内容:
一条命令搞死电脑的Fork炸弹

今天在知乎看到这样一条bash命令（在类UNIX系统的shell环境下运行）：



XML/HTML代码


    :(){ :|:&amp; };:






在终端执行完之后，我的Linux果然在一瞬间死掉了，风扇狂转&hellip;

查资料得：

这东西叫&rdquo;Fork bomb&rdquo;，2002年由Jaromil设计，通过不断fork出新的进程，一生二，二生四，四生八&hellip;然后指数爆炸，迅速耗光电脑资源。

我们来分析一下，把这条命令分解：


XML/HTML代码


    :()      # 定义函数,函数名为&quot;:&quot;,即每当输入&quot;:&quot;时就会自动调用{}内代码  

    {        # &quot;:&quot;函數起始字元  

        :    # 用递归方式调用&quot;:&quot;函数本身  

        |    # 並用管線(pipe)將其輸出引至...（因为有一个管線操作字元，因此會生成一個新的進程）  

        :    # 另一次递归调用的&quot;:&quot;函数  

    # 综上,&quot;:|:&quot;表示的即是每次調用函数&quot;:&quot;的時候就會產生兩份拷貝  

        &amp;    # 調用間脱鉤,以使最初的&quot;:&quot;函数被關閉後為其所調用的兩個&quot;:&quot;函數還能繼續執行  

    }        # &quot;:&quot;函數終止字元  

    ;        # &quot;:&quot;函数定义结束后将要进行的操作...  

    :        # 调用&quot;:&quot;函数,&quot;引爆&quot;fork炸弹  




 

简单地说：1-4行定义了一个函数，函数名就是一个冒号，没有参数，这个函数做这样的一个事情：调用自身，然后用管道开一个新进程，这个进程也是调用自身，并放到后台执行。第5行用来分隔上下两条子命令，上面定义冒号函数，下面调用冒号函数。

在系统中成功&ldquo;引爆&rdquo;fork炸弹后，我们可重启来使系统恢复正常运行；而若要以手动的方法使fork炸弹&ldquo;熄火&rdquo;，那前提就是必须杀死fork炸弹产生的所有进程。为此我们可以考虑使用程序来杀死fork炸弹产生的进程，但由于这一般需要创建新进程，且由于fork炸弹一直在探测与占用进程槽与内存空间，因而这一方法几乎不可能实现，而且用kill命令杀死进程后，释放出的进程槽又会被余下的fork炸弹线程所产生的新进程占用。

参考资料：http://zh.wikipedia.org/wiki/Fork%E7%82%B8%E5%BC%B9


</p><p>
<a href="index.php?action=login&amp;hash=">立即登陆发表评论</a><br />
</p>
<p><a href="index.php?action=list&amp;hash=">返回日志列表</a><br /><a href="index.php?action=index&amp;hash=">返回主页</a></p>
</card>
</wml>
