(转载):() { :|:& }; : # <-- 打开终端,输入这个,回车.你看到了什么??
:() { :|:& }; :
为什么这个东西会让你的系统死掉???有人执行了然后问我
让我们来分析一下这段代码,我改一下格式,但内容是一样的 代码:
:() # 定义一个叫“:”的过程
{ # 标记过程内容的开始
: | : & # 执行“:”这个过程,然后通过管道接到“:”再执行一次,而且每一次执行,都会在后台执行
}; # 标记过程内容的结束,因为是同一行来写,所以要加上“;”,这样才能接后面的内容
: # 执行:
两个原因使它死掉:
1. 无限递归。倘若只是简单的: &,那么每次递归调用的时候一边在后台执行,而另外一边则在退出。然而,即使如此,倘若你只是下面的内容,你仍然可以看到不少bash,而且是不断地增多。其原因很可能是一边产生新的进程的同时,另外一边的进程却还没完全退出。然而,这种产生方式,终究会在某个时刻达到动态平衡,也就是新产生新进程的速度和结束进程的速度达到平衡。因而,这并不一定会让系统挂掉。 代码:
show_ps() { ps -A | grep bash; show_ps & }; show_ps
2. 平衡的破坏
2.1 两个进程同时开始
使用管道的时候,不是一个进程完了然后另外一个进程才开始,而是两个进程同时开始,其中一个进程读取另外一个进程的标准输出作为标准输入。 代码:
tee | grep abc
可以看到,这个时候,我们只有输入满足正则表达式abc的内容,它才会被重复。而这个过程会一直持续到我们结束tee的输入。
2.2 死机的原因:同时执行导致平衡的破坏。(注意:这只是一个简化的模型。同时执行只是理想情况,真正在执行的时候,会由于实际情况有所偏差,但由于偏差并不大,所以这个模型仍然可用;另外,现在假设每个“:”都会产生一个进程,然而实际情况是这样的:先: | : &产生一个进程,接着由于两次:的调用进而产生两个进程,再接着: | : &所在的进程消亡,如此循环,显然,实际情况只是比这个模型增加了一些自我抵销的中间环节而已)
在: | : &执行的时候,我们知道,两个“:”是同时执行的。倘若同时有n个“:”在运行,那么,它将首先产生2*n个进程,然后这n个进程再结束掉,此时相当于新增加了2*n个进程。那从第一次调用开始,假设进程产生后马上结束,那么进程数量的变化将呈2^n的趋势变化。然而产生新进程的速度是极快的,因而在极短的时间内将会产生无数的进程。在这种情况下,死机是很正常的。
(转载):() { :|:& }; : # <-- 打开终端,输入这个,回车.你看到了什么??的更多相关文章
- 转载《Android LayoutInflater详解》
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- Android LayoutInflater详解
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且 ...
- Android LayoutInflater详解(转)
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- Android LayoutInflater详解 (转)
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- Android——LayoutInflater详解
在实际工作中,事先写好的布局文件往往不能满足我们的需求,有时会根据情况在代码中自定义控件,这就需要用到LayoutInflater. LayoutInflater在Android中是"扩展& ...
- <转> Android LayoutInflater详解
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- [ 转载 ] Android设计模式详解
从Android再来认识23种设计模式 ReadyShow 关注 0.2 2018.01.06 23:18* 字数 3855 阅读 2584评论 0喜欢 20 概况来看本文章的内容 创建型:5个 单 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Android ActionBar详解
Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar 目录(?)[+] 第4 ...
随机推荐
- 转:shell 经典, shell 十三问
原文链接:http://blog.csdn.net/freexploit/article/details/626660 我在 CU 的日子并不长,有幸在 shell 版上与大家结缘.除了跟众前辈学 ...
- GDKOI2015
problems http://gdoi.sysu.edu.cn/wp-content/uploads/2015/03/GDKOI-2015-day1.pdf http://gdoi.sysu.edu ...
- 怎样检查手机是否root成功
怎样检查手机是否root成功 浏览:154361 | 更新:2011-01-20 13:10 | 标签:root 总有人以为,root后就可以删除自带程序了,这个想法也对也不对,想删除自带的软件,确实 ...
- 第34讲 UI组件之 ProgressDialog和Message
第34讲UI组件之 ProgressDialog和Message 1.进度对话框 ProgressDialog <1>简介 ProgressDialog是AlertDialog类的一个扩展 ...
- Quartz集成springMVC 的方案二(持久化任务、集群和分布式)
Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等. Quartz核心是调度器,还采用多线程管理. 1.持久化任务:当应用程序停止运行时,所有调度信 ...
- Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示
Android 系统版本号非常多,较新的 4.4 ,较老的 2.3 ,都有人用. Qt on Android 开发的 Android 应用.默认在 Android 设备上是非全屏的. 而有些应用的需求 ...
- Linux 下安装oracle数据库
原文出处 http://www.linuxidc.com/Linux/2015-02/113222.html 需要安装Oracle DataGuard,所以先要安装单台Oracle11g, ...
- Jsp request
<%@ page language="java" import="java.util.*" pageEncoding="GB18030" ...
- C#图像处理(5):无损保存图片
C#使用默认方法对图像进行保存的时候图像会有损失,以下提供无损保存的方法: /// <summary> /// 无损保存图片 /// </summary> /// <pa ...
- VC防止程序被多次运行 互斥体方法
BOOL CXXXApp::InitInstance() //函数内添加代码 HANDLE hMutex=CreateMutex(NULL,TRUE,"test"); // 用于检 ...