fork 炸弹
偶然看到一串奇怪的命令,手贱执行了一下,没想到系统直接卡死
代码
1 | alias clear=':(){ :|: &};:' |
一次偶然的机会,我看到了上面这段代码,然后手贱执行了一下:
1 | :(){ :|: &};: |
电脑直接就卡死了,过了几分钟,我才回过神来,是这段代码导致的。
网上搜了一下,这段代码就是著名的 fork bomb
即 fork 炸弹,其会以指数级的速度快速创建线程,迅速将整个系统的资源耗尽,最终导致系统卡死。
fork 炸弹一旦引爆,基本只能重启。
代码解析
最开是看到这段代码一脸懵逼,怎么就卡死了呢,网上搜了一下,大致了解了其工作流程。
在这一行代码中,我们定义了一个名为 :
的函数:
1 | :(){ :|: &};: |
把 :
换成一个常见的函数名,比如 bomb
,那么上面这段代码可以翻译为:
1 | bomb(){ bomb|bomb &};bomb |
再展开一下:
1 | bomb(){ |
这样看起来就直观多了,前三行定义了一个函数,第四行调用了该函数。
而函数的行为是:后台的、通过管道递归调用自身两次
由于管道操作会创建新的进程,所以每次调用函数都会产生两份拷贝,这样函数就会呈指数级的增长,可以在极短的时间内耗光计算机资源。