管道是 Linux 里的一种文件类型,同时也是 Linux 系统下进程间通信的一种方式

 

创建一个管道文件有两种方式:

  1.  Shell 下命令 mkfifo + filename,即创建一个有名管道
  2.  C 语言里调用 pipe() 函数,创建一个无名管道

有名管道 / 无名管道 

区别:

  1.  有名管道在程序外部使用 mkfifo 命令生成,无名管道在程序内部调用 pipe() 函数创建;
  2.  顾名思义,有名管道有文件名,无名管道没有文件名;
  3.  有名管道生成后直到删除都存在,无名管道在程序退出时则生命周期结束;
  4.  有名管道可以在任意两个进程间传输数据,无名管道只能在父子进程间传输数据;

注意:有名/无名管道都是半双工,即只能从一端向另一端发送数据,输入端与输出端在打开管道时是固定的

管道文件的特性

  1.  打开管道必须有两端(两个进程)同时打开一个管道,分别为读(r)和写(w);读取端负责从管道中读取数据,写入端负责向管道中输入数据;
  2.  当读端关闭,写端会收到信号,终止程序;当写端关闭,读端不再进入阻塞;
  3.  管道文件的大小始终为 0,打开管道文件时,在内存中为其分配空间,管道关闭后数据消失;Linux 默认 PIPE_SIZE(一个管道最大存储大小)为 64k,PIPE_BUF(管道缓冲区)为 4k;当对管道进行 write 操作时,若此时有多个进程同时写入一个管道,且写入的字节大小超过 PIPE_BUF,则写操作的数据有可能相互穿插

管道文件的内存空间有两个指针 head / tail ,head 指针随读取数据向后移动,tail 指针随写入数据向后移动,当指针到文件尾时,会造成读阻塞 (读取结束)/ 写阻塞(空间已满)
 
注意
当我们调用 pipe() 创建无名管道后 fork() 以实现父子进程间通信,此时 pipe() 生成的两个 r/w 描述符引用都会加一,在父子进程中同时存在 r/w 两个描述符,此时应当在父子进程中分别 close 不用的描述符,使 r/w 端只存在一个引用,这样父子进程间通信时可以正常读写响应

Linux -- 进程间通信之管道的更多相关文章

  1. Linux 进程间通信(二) 管道

    Linux 进程间通信-管道 进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源.但是,进程不是孤立的,不同的进程之间需要信息的交换以及 ...

  2. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  3. Linux进程间通信之管道

    1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共 ...

  4. Linux进程间通信(一) - 管道

    管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道. 例如:ps | grep vsftpd .管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准 ...

  5. linux进程间通信-有名管道(FIFO)

    有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的 ...

  6. Linux进程间通信-命名管道

    前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...

  7. Linux进程间通信-匿名管道

    前面我们讲了进程间通信的一种方式,共享内存.下面看一看另一种机制,匿名管道.1.什么是管道管道是一个进程的数据流到另一个进程的通道,即一个进程的数据输出作为另一个进程的数据输入,管道起到了桥梁的作用. ...

  8. linux进程间通信--有名管道

    有名管道 只有当一个库函数失败时,errno才会被设置.当函数成功运行时,errno的值不会被修改.这意味着我们不能通过测试errno的值来判断是否有错误存在.反之,只有当被调用的函数提示有错误发生时 ...

  9. linux进程间通信--无名管道

    管道 只能用于具有亲缘关系的进程之间通信是一个半双工的通信模式, 具有固定的写读端和写端,管道可以看成一种特殊的文件,对它可以使用普通的read.write等操作 管道的创建: #include &l ...

随机推荐

  1. hystrix原理

    一.hystrix 产生背景 微服务是解决复杂服务的一个方案,在功能不变的情况下,对一个复杂的单体服务分解为多个可管理的分支.每个服务作为轻量的子服务,通过RPC实现服务间的关联,将服务简单化.每个服 ...

  2. RSA学习1

    对PEM文件(以前是一个邮件编码)进行编码,得到RSA公钥.国密的RSA标准,一般是tlv(tag-version)格式的. 明文hash后的数据进行BER编码再进行加密.-签名 对于RSA的结构,全 ...

  3. Token refresh的实现

    实现原理: 在access_token里加入refresh_token标识,给access_token设置短时间的期限(例如一天),给refresh_token设置长时间的期限(例如七天).当活动用户 ...

  4. Spring Boot2 系列教程(二十)Spring Boot 整合JdbcTemplate 多数据源

    多数据源配置也算是一个常见的开发需求,Spring 和 SpringBoot 中,对此都有相应的解决方案,不过一般来说,如果有多数据源的需求,我还是建议首选分布式数据库中间件 MyCat 去解决相关问 ...

  5. 学习笔记25_MVC前台API

    **当请求url的规则有所改变时,前台的所有超链接的href都得改,为了避免多处修改,可以href = "< %=url.Action("Controller",& ...

  6. MVC5用户控件

    1. 添加一个model,用于给用户控件传递数据: 2.添加一个部分视图 . 3. 部分视图中,引入model,用于传递数据 4. 在要插入用户控件的地方,这样写 @Html.Partial(&quo ...

  7. 题解 【洛谷】AT654

    题解 AT654 [役人[错题已隐藏]] 此题题面没搬过来, 会日语的dalao可以自行去ATCoder查看. 给出此题的JavaAC代码: public class Main { public st ...

  8. RabbitMQ-交换机模式

    在说正题之前先解释一下交换机模式是个笼统的称呼,它不是一个单独的模式(包括了订阅模式,路由模式和主题模式),交换机模式是一个比较常用的模式,主要是为了实现数据的同步. 首先,说一下订阅模式,就和字面上 ...

  9. Function题解

    这个题最优策略一定是向左上走到某一列再往上一直走. n*q在线暴力可做,离线按y排序,单调栈维护凸壳. 具体来说:对于i<j若A[i]>A[j] 即j的斜率小而且纵截距小,一定比i优,并且 ...

  10. 使用Samba或实现文件共享

    安装Samba服务软件包: 命令:yum install samba 使用Samba服务口令验证方式可以让共享文件更加的安全,做到仅让信任的用户访问,而且验证过程也很简单 第1步:检查当前是否为use ...