:() { :|:& }; :

标题是一组非常有意思的脚本,如果你在ubuntu(其他linux版本没有试过)机器上执行很可能让你的机器内存耗尽然后引发悲剧

那么原因是为什么了?同事@GF给我一个重要的提示,让我来拆解一下这组脚本,“:”号太碍眼,让我换成a看一下

a() { a|a& }; a

那么就可以这样解释,定义一个a函数,a函数里面再递归的调用a函数,从而产生了无限递归。
慢着这还没有完,如果你以为仅仅是无限递归就能瞬间搞定server你就错了。注意里面的”|“,pipe的使用才是致命的,这里不仅会递归而且还会fork出一个进程继续执行递归函数。当你简单的执行循环递归的时候你可能在过一段时间之后内存耗到了进程允许的最大内存时该进程就会挂掉,对系统不产生大的危害,但是如果你以2的指数幂去fork进程并执行递归函数,那么结果就是你的系统瞬间内存就会耗尽。

慢着还没有完,呵呵,卖个关子,先恭喜一下Mac用户,Mac用户就不用尝试这组脚本了因为你们对此免疫
发现这一点纯属巧合,我在虚拟机上装了Mac OS在写这篇文章之前在Mac OS试了一下,Mac OS会打印如下错误

-bash: fork: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable

这是因为,Mac对user process 是有限制的,所以一旦超过允许的限制进程数将不会再被创建,所以也就不会耗光系统内存资源。well done!!!

生活总是因为一些乐趣而变得动人

Meta

Published: Feb. 25, 2012 Author: ivan Comments:   Word Count: 43
Bookmark and Share

Next: Textile&Pygments实现代码高亮

Previous: 由IsDebugEnabled想到的

Tags

funny script

Comments powered by Disqus