简单点就是说,一个命令的结果作为另外一个命令(结果)的输入 。

管道是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 管道是什么 ?原理的更多相关文章

  1. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  2. Linux数据包路由原理、Iptables/netfilter入门学习

    相关学习资料 https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html http://zh.wik ...

  3. Linux管道的实现机制

    7.1.1 Linux管道的实现机制 在Linux中,管道是一种使用非常频繁的通信机制.从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为: ...

  4. linux 管道--转

    linux 管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. ...

  5. Linux管道思想

    1.Linux管道 {{book | upper |lower | capfirst}} 含义:就是把前一个命令的结果当成后一个命令的输入.然后在下一个管道中输出满足条件的数据,如此继续数据的流向运动 ...

  6. linux管道详解

    原文链接:http://blog.csdn.net/qq_38646470/article/details/79564392 符号表示 | 和管道特别形象. 作用:     管道是Linux中很重要的 ...

  7. Linux入门-7 Linux管道、重定向以及文本处理

    Linux管道.重定向以及文本处理 1 Linux多命令协作:管道及重定向 管道和重定向 2 Linux命令行文本处理工具 文件浏览 基于关键字搜索-grep 基于列处理文本-cut 文本统计-wc ...

  8. 动态替换Linux核心函数的原理和实现

    转载:https://www.ibm.com/developerworks/cn/linux/l-knldebug/ 动态替换Linux核心函数的原理和实现 在调试Linux核心模块时,有时需要能够实 ...

  9. Linux管道及重定向

    Linux管道及重定向 对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制.在shell中,我们通常使用符合'|'来表示管道,符号'>'和'<'表示重 ...

  10. linux管道pipe详解

    linux管道pipe详解 https://blog.csdn.net/qq_42914528/article/details/82023408

随机推荐

  1. Java 类加载器及加载Class字节码

    参考来源:http://www.cnblogs.com/fingerboy/p/5456371.html       java笔记--理解java类加载器以及ClassLoader类 参考来源:htt ...

  2. 开源作品-PHP写的Redis管理工具(单文件绿色版)-SuRedisAdmin_PHP_1_0

    前言:项目开发用到了Redis,但是在调试Redis数据的时候,没有一款通用的可视化管理工具.在网络找了一些,但是感觉功能上都不尽人意,于是决定抽出一点时间,开发一个用起来顺手的Redis管理工具.秉 ...

  3. dubbo之线程模型

    事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度. 但如果事件处理逻辑较慢,或者需要发起新的IO请求 ...

  4. 【sqli-labs】 less27a GET- Blind based -All you Union&Select Belong to us -Double Quotes(GET型基于盲注的去除了Union和Select的双引号注入)

    和less 27一样,单引号换双引号 http://192.168.136.128/sqli-labs-master/Less-27a/?id=0"%a0uNion%a0sElect%a01 ...

  5. drf02 序列化器详解 Serializer

    作用 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型3. 反 ...

  6. C#第七节课

    for嵌套 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System ...

  7. 重装系统后导入raid

    参考 https://ubuntuforums.org/showthread.php?t=2002217 https://www.funkypenguin.co.nz/note/importing-e ...

  8. 42.query string分词

    主要知识点: 1.queery string 分词 2.38节中搜索结果解析 3,测试分词器     一.query string分词 query string必须以和index建立时相同的analy ...

  9. 35.multi-index和multi-type搜索模式

        一.multi-index和multi-type搜索模式 /_search:所有索引,所有type下的所有数据都搜索出来 /index1/_search:指定一个index,搜索其下所有typ ...

  10. openldap+openssh+jumpserver实现跳板机监控系统

    首先感谢 http://www.jumpserver.org/ 提供的优秀跳板机系统. 我们把跳板机系统经过二次开发主要是 弃用角色功能使用ldap自动登录. 添加登录后临时认证. 上传下载我们自己在 ...