目录

  • 一、管道的理解
  • 二、匿名管道
  • 三、命名管道
  • 四、管道的通信流程
  • 五、管道的特性

  进程间通信方式有多种,本文介绍的是管道,管道分为匿名管道和命名管道。

一、管道的理解

  生活中的管道用来传输资源,例如水、石油之类的资源。而进程间通信的管道传输的是数据,管道的使用场景就是数据传输

管道的特性:

  • 半双工通信
  • 先进先出

  半双工通信:数据可以沿两个方向发送,但是同一时间一个管道中只允许向一个方向发送数据,也可以称之为可以选择方向的单向通信。但实际使用管道的时候,方向一旦确定就不再更改了。就类似于家里的自来水管,自来水只会从水厂传输到家里,而不是从家里把水传输到水厂。

  先进先出:先发送的数据先被接收,数据的发送顺序就是数据的接受顺序,就像队列一样,先进先出。(注意:管道中数据不能一直无限的写入,是有大小限制的)

  如图:发送顺序是:1、2、3、4,接受顺序也是:1、2、3、4。

管道的本质:

  内核中的一块缓冲区,而缓冲区就是内核空间中的一块内存,这块内存被用来进行进程间通信。

管道的分类:

  • 匿名管道
  • 命名管道

二、匿名管道

理解匿名管道:

 (1)内核中的缓冲区(也就是管道)没有标识符(注意和文件标识符区分开,这两不是一个东西),只能用于具有亲缘关系的进程间通信。

 (2)因为标识符是一个管道的名字,一个管道如果没有名字,自然就是匿名管道。

匿名管道如何实现具有亲缘关系的进程间通信?

 (1)在Linux中,系统在操作管道的时候,是把管道当作文件来进行操作的,因此管道都有对应的文件描述符。父进程先创建匿名管道,然后再创建子进程,这样父子进程就可以使用这个匿名管道来通信。

 (2)因为父进程创建了匿名管道后,系统是把这个管道当作文件进行处理的,因此会有对应的文件描述符(文件描述符就是一个文件在fd_arr数组中的下标),文件描述符会占据数组中的最小未使用的下标。

 (3)父进程创建子进程后,子进程会复制父进程pcb中的大部分信息,其中就包含了fd_arr[]数组,因此子进程也会得到文件描述符的相关信息。虽然子进程会初始化页表和虚拟空间,但不会修改pcb中和IO相关的信息。

 (4)子进程复制fd_arr[]数组后,也就知道了这个管道的操作句柄,有了这个操作句柄,父子进程就可以访问同一个匿名管道了。

三、命名管道

理解命名管道:

 (1)内核中缓冲区具有标识符,也就是这个管道有名字。

 (2)标识符是一个可见于文件系统的特殊管道文件,多个进程通过打开同一个标识符文件,就可以访问同一块内核中的缓冲区(命名管道)。

  如图:管道文件标识符test.fifo(这是一个文件),进程通过这个文件来访问内核中的缓冲区(命名管道)。即便是没有亲缘关系的进程,也可以通过它来访问内核中的同一块缓冲区(命名管道)。

四、管道的通信流程

  进程A要把数据通过管道发送给进程B,就首先要把数据拷贝一份放到内核空间的管道中(第一次拷贝)。然后进程B从内核空间的管道中把这个数据再拷贝一次带回来(第二次拷贝),这样才能拿到这个数据。

  因此使用管道传输数据时,需要经历两次拷贝

五、管道的特性

  1. 管道中的数据是一次性的,读取后就没有了,空间就被腾出来了。
  2. 如果管道中没有数据,读端(read)默认会阻塞,直到读取到了数据后才会返回。
  3. 如果管道中数据写满了,写端(write)默认会阻塞,直到数据被读出,管道中有了空闲空间才可以继续写入数据。
  4. 管道的读写是一种字节传输服务,数据会在缓冲区堆积,并且遵循先进先出原则(类似于队列的先进先出)。
  5. 如果管道所有写端被关闭,读端(read)读完所有数据后,如果继续读取数据将不再是阻塞而是返回0。(管道中read返回0,最主要表示没人写数据了,你继续等着读数据没啥意义)
  6. 若管道所有读端被关闭,写端(write)继续写入数据,则触发异常,退出程序。
  7. 管道在写入数据时,如果数据大小不超过PIPE_BUF大小,保证原子操作,防止数据混乱。(原子操作:要么这个操作一次性完成无法被打断,要么不做这个操作)
  8. 自带同步与互斥,使得数据的读取和写入更加合理。
  9. 生命周期随进程,当进程结束后,管道也就会被关闭。

  注意:如果父子进程都打开了这个管道,那么只有当父子进程对于这个管道的写端全都被关闭,读端在读完缓冲区后,才会返回0。

Linux IPC:匿名管道 与 命名管道相关推荐

  1. Linux进程通信——匿名管道、命名管道、管道的特性和共享内存

    Linux进程通信--匿名管道.命名管道.管道的特性和共享内存 一.管道 1.1 什么是管道? 1.2 匿名管道 <1> 匿名管道参数说明 <2> fork共享管道原理 < ...

  2. 【Linux】进程间通信--管道(匿名管道和命名管道)

    文章目录 前言 进程间通信的目的 管道 匿名管道 管道特点 站在文件描述符角度理解管道 匿名管道通信读写特点 命名管道 命名管道的原理 命名管道的创建 命名管道完成两个不同进程通信 匿名管道和命名管道 ...

  3. 进程通信:匿名管道和命名管道

    一.进程间通信方式 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 有名管道 (named pipe) : ...

  4. 进程间的通信IPC(无名管道和命名管道)

    进程间的通信IPC介绍 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量 ...

  5. linux有名管道大小,Linux中的pipe与named pipe(FIFO),即管道和命名管道

    Linux 管道对阻塞之前一次写操作的大小有限制. 专门为每个管道所使用的内核级缓冲区确切为 4096 字节. 除非阅读器清空管道,否则一次超过 4K 的写操作将被阻塞. 实际上这算不上什么限制,因为 ...

  6. 进程间通信之管道(匿名管道与命名管道)

    进程间通信之管道 进程间通信 管道 什么是管道 管道分类--1.匿名管道 匿名管道举例 管道的特点 管道分类--2.命名管道 创建一个命名管道 举例 命名管道的打开规则 匿名管道与命名管道的区别 具体 ...

  7. 进程间通信:管道和命名管道(FIFO)

    目录 概述 IPC 对象的持续性 什么是管道 读取外部程序的输出 将输出送往 popen 传递更多的数据 如何实现 popen pipe 调用 跨越 fork 调用管道 父进程和子进程 管道关闭后的读 ...

  8. python 命名管道_命名管道实践

    命名管道技术实验 管道介绍 管道(Pipe)是一种进程间的通信机制,Windows.Linux和UNIX都使用这种机制. 管道是通过I/O接口存取的字节流创建管道后,通过使用操作系统的任何读或写I/O ...

  9. java 命名管道_linux 命名管道实例详解

    linux进程间通信--命名管道 FIFO(命名管道)不同于匿名管道之处在于它提供⼀个路径名与之关联,以FIFO的⽂件形式存储于⽂件系统中.命名管道是⼀个设备⽂件,因此,即使进程与创建FIFO的进程不 ...

最新文章

  1. JAVA Thread线程异常监控
  2. 图片裁剪功能学习小结
  3. Unix中的I/O模型和Java NIO
  4. JQuery中的基本筛选选择器
  5. android opencv 银行卡识别,NDK 开发之使用 OpenCV 实现银行卡号识别
  6. docker添加新的环境变量_Docker环境变量
  7. 宝塔linux 做负载均衡,利用BT宝塔面板做网站多服务器负载均衡图文教程
  8. POJ 1054 The Troublesome Frog(枚举 + 剪枝)
  9. c语言编程和PS,求高人剖析下这道C语言编程题(PS:越详细越好)
  10. python编程(paddle ocr)
  11. [求助]请教一个问题!
  12. 企业多园区统一灾备建设最佳实践
  13. 【编解码】从零开始写H264解码器(1) 总纲
  14. struts 标签logic:iterate用法详解
  15. 清华姚班出身,95后博士生从网瘾少年到发表顶会论文的科学家
  16. 两融杠杆渐入警戒区 专家警示结构性风险
  17. 毕业两年,只会Crud,侥幸通过面试定级 P6,没想到我也可以入职阿里!(面经分享)
  18. TCHAR * 转为char *   和 char  * 转为 TCHAR *
  19. java mysql选择题_MySQL选择填空基础题
  20. 如何彻底删除adsafe

热门文章

  1. 海思官方SDK Hi3516EV200_SDK_V1.0.1.0的编译教程
  2. 【计算机毕业设计】java ssm网上宠物商店系统
  3. 自动化测试之-测试用例设计方法总结
  4. [noip2016]天天爱跑步
  5. 【2018NOIP普及组】T2:龙虎斗 试题解析
  6. Interwine China 2009广州国际名酒展
  7. ArcGIS快速分别导出大量范围线的坐标到报盘Excel格式
  8. usb 键盘码表_ASCII码表,键盘按键码表,虚拟键盘按键码表
  9. php preg_replace()漏洞记录
  10. 2-10 CAD基础 偏移(offset)