Linux 管道是什么 ?原理
简单点就是说,一个命令的结果作为另外一个命令(结果)的输入 。
管道是linux提供的一种常见的进程通信工具,也是很多shell命令能够灵活组合产生强大用途的一个重要工具。
管道是什么?
管道,顾名思义就是个管子,里面可以流过去很多东西。举个栗子 ls | morels输出列出来的文件目录就通过‘|’这个管道流向了more这个文本浏览器。相同的功能我们也可以通过ls > tmp ; tmp > more来完成。实际上管道的功能和第二个方法也很像。管道也是一个文件ls的输出送到这个文件,more再从这个文件将东西拿走。 所不同的是管道不同于普通的文件,是一套特殊的文件pipefs,在磁盘中没有映像,只在内存中存在,而且只存在于存在亲缘关系的进程之间。然后省略若干和文件系统,linux进程相关的知识…………好吧我还是说两句吧。
为什么是特殊的文件?
我们知道有句传说是linux系统中一切皆文件,事实上这句话很忽悠人,虽然都是文件一个文本文件能和一个CPU设备一样么。实际上常用的特殊文件类型就有十多种,之所以要把他们都组织成文件是为了应用级别的程序员编程方便,不管操纵什么东西,文件、设备、socket等等都可以open之后read,write再close,可事实上调用的底层的系统程序是不一样的。这个想想也知道,写一个文本用的实际操作和往一个socket写东西怎么可能一样。pipe特殊就在于它是进程通信的一种方法,这种发法要保证一定的速度,所以就不好扔到硬盘上去读写了,干脆就直接在内存上读写了,所以它成为一个文件只是为了接口的方便。至于说它只在有亲缘关系的进程间共享,是因为管道属于进程打开的文件,只有创建管道的进程fork出来的子进程可以共享这个管道的文件描述符,其他无关系的进程是看不到这个管道的,所以说是一种非常狭隘小资的通信方式。
管道的创建
管道有两个口,一个入水口一个出水口。pipe系统调用会返回两个文件描述符,一个文件描述符用来写一个用来读。如上图所示,两个file结构指向同一个inode,对应管道在内存种所获得的一片区域。这里稍微要注意的一点是,尽管我们平时的应用都是一个管道对应一个写进程一个读进程,但是管道本身是支持多个进程进行读写的,他们只要对相同的描述符进行操作,加之系统的互斥进程就可以实现多进程的通信。这里也可以看出管道是半双工的,没有一个文件描述符可以用来进行读and写,如果想在两进程间进行全双工操作就开两条管道吧。
管道读写
前面说过了,不同的文件类型的write和read操作是不一样的,那么是怎么通过一个统一的write和read来找到对应的操作呢?看一下write函数的声明size_t write(int fd, const void *buf, size_t nbytes),从进程这边传过去的唯一一个可能区分文件类型的就是这个文件描述符fd了,也就是通过这个fd文件系统会找到它到底是哪个文件,再去采取相应的函数调用。当然如果是write操作的话还要涉及到一些对内存加锁的操作。
另一种管道FIFO
如果说管道有什么缺点的话,就是它只能在自家亲戚中使用,不利于社会共同富裕,没有关系的进程就无法通过管道进行勾搭了。于是内核打算采用一种实名制的方式来登记一下管道,这就是FIFO。
FIFO和pipe用的是同样的数据结构,同样的读写方式,不同的是内核为他们在磁盘注册了一个节点,这样所有进程都能看到这个硬盘上的节点,只要有权限就可以操作了,当然内容还是在内存中。并且这个实体可以用读写模式来打开,也就可以实现全双工了。
其他的话
上面都是一些机制的介绍。其实想写一下读源码的感受的,只是源码的感受过于琐碎,很难理出一个头绪来,而且源码的大框架是上面的机制,但看得时候注意到的更多是细节的实现方式,很多东西是和机制无关的。本以为这段的代码变更应该不会很大,但是看了一下commit记录发现变化还是很多的,很多新加的功能是除了注释找不到相关介绍的,只能自己从代码里推敲。还有一些改进方式是为了弥补以前的缺陷的,看这部分可以提升一些对系统整体的认识。所以鼓励大家在看过原理之后还是要看一下代码,代码中会有很多意外的收获,而这些收获又是很难通过别人讲述获得的
Linux 管道是什么 ?原理的更多相关文章
- linux管道命令grep命令参数及用法详解---附使用案例|grep
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- Linux数据包路由原理、Iptables/netfilter入门学习
相关学习资料 https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html http://zh.wik ...
- Linux管道的实现机制
7.1.1 Linux管道的实现机制 在Linux中,管道是一种使用非常频繁的通信机制.从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为: ...
- linux 管道--转
linux 管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. ...
- Linux管道思想
1.Linux管道 {{book | upper |lower | capfirst}} 含义:就是把前一个命令的结果当成后一个命令的输入.然后在下一个管道中输出满足条件的数据,如此继续数据的流向运动 ...
- linux管道详解
原文链接:http://blog.csdn.net/qq_38646470/article/details/79564392 符号表示 | 和管道特别形象. 作用: 管道是Linux中很重要的 ...
- Linux入门-7 Linux管道、重定向以及文本处理
Linux管道.重定向以及文本处理 1 Linux多命令协作:管道及重定向 管道和重定向 2 Linux命令行文本处理工具 文件浏览 基于关键字搜索-grep 基于列处理文本-cut 文本统计-wc ...
- 动态替换Linux核心函数的原理和实现
转载:https://www.ibm.com/developerworks/cn/linux/l-knldebug/ 动态替换Linux核心函数的原理和实现 在调试Linux核心模块时,有时需要能够实 ...
- Linux管道及重定向
Linux管道及重定向 对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制.在shell中,我们通常使用符合'|'来表示管道,符号'>'和'<'表示重 ...
- linux管道pipe详解
linux管道pipe详解 https://blog.csdn.net/qq_42914528/article/details/82023408
随机推荐
- DotnetCore安装介绍
微软的DotnetCore发布至今,已经有段时间了,我们都非常关注我们它能为我们带来什么,我们能通过它做什么?要解决这些问题,不仅仅需要基本的了解意外,还需要知道是开发环境是怎么搭建的,接下来我们就一 ...
- BZOJ 4563 错排+高精度
思路: 把障碍移到对角线 就发现 这是个错位排列问题 用错排公式即可解 s[i]=(s[i-1]+s[i-2])*i //By SiriusRen #include <cstdio> #i ...
- POJ 1111(数字很吉利嘛) 简单BFS
Image Perimeters Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8594 Accepted: 5145 Desc ...
- Android学习——数据存储之文件存储
将数据存储到文件中并读取数据 1.新建FilePersistenceTest项目,并修改activity_main.xml中的代码,如下:(只加入了EditText,用于输入文本内容,不管输入什么按下 ...
- Microsoft SQL Server数据库学习(一)
数据库的分类: 1.关系型数据库: 数据库名称 类型 公司 平台 Access 小型数据库 微软 Windows Mysql 小型数据库 AB--sun--甲骨文 Windows/linux/mac ...
- jq 获取表单所有数据
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- node.js的querystring模块
querystring主要是用于对字符串进行操作和解析.共有四个方法:querystring.parse,querystring.stringify,querystring.escape,querys ...
- vue中怎样实现 路由拦截器
vue中怎样实现 路由拦截器(当用户没有登录的时候,跳转到登录页面,已经登录的时候,不能跳转到登录页,除非后台token失效) 在 我们需要实现这样 一个功能,登录拦截 其实就是 路由拦截,首先在定义 ...
- linux 下取进程占用 cpu/内存 最高的前10个进程
linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ;|head linux下获取占用内存资源最多的10个进程,可以使用如下命令组合: ;|head 命令组合解析(针对CPU的,M ...
- BZOJ 1585: Earthquake Damage 2 地震伤害 网络流 + 最小割
Description Farmer John的农场里有P个牧场,有C条无向道路连接着他们,第i条道路连接着两个牧场Ai和Bi,注意可能有很多条道路连接着相同的Ai和Bi,并且Ai有可能和Bi相等.F ...