我们通常把一个进程连接到另一个进程的一个数据流称为一个“管道”,通常是用作把一个进程的输出通过管道连接到另一个进程的输入。管道本质上是内核的一块缓存内核使用环形队列机制,借助内核缓冲区(4k)实现。

  • 管道是Unix中最古老的进程间通信的形式;
  • 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”;
  • 管道的实质就是操作系统所提供的一块内存;

每个管道只有一个页面作为缓冲区,该页面是按照环形缓冲区的方式来使用的。这种访问方式是典型的“生产者——消费者”模型。当“生产者”进程有大量的数据需要写时,而且每当写满一个页面就需要进行睡眠等待,等待“消费者”从管道中读走一些数据,为其腾出一些空间。相应的,如果管道中没有可读数据,“消费者” 进程就要睡眠等待,具体过程如下图所示:

管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大(内核缓冲区(4k)),它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。

匿名管道

匿名管道是基于文件描述符的通信方式。实现两个进程间的通信时必须通过fork创建子进程,实现父子进程之间的通信。

单独创建一个无名管道,并没有任何实际的意义。我们一般是在一个进程在由pipe()创建管道后,一般再由fork一个子进程,然后通过管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。

  • 1. 父进程调用pipe函数创建管道,得到两个文件描述符fd[0]、fd[1]指向管道的读端和写端。
  • 2. 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。
  • 3. 父进程关闭管道读端,子进程关闭管道写端。父进程可以向管道中写入数据,子进程将管道中的数据读出。由于管道是利用环形队列实现的,数据从写端流入管道,从读端流出,这样就实现了进程间通信。

匿名管道读写规则:

  • 当没有数据可读时:O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止;O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN;(基于不同版本linux内核返回值可能存在差异,Linux5.4.6返回值-EAGAIN)
  • 当管道满的时候:O_NONBLOCK disable:write 调用阻塞,直到有进程读走数据;O_NONBLOCK enable:调用返回 -1,error 值为EAGAIN;(基于不同版本linux内核返回值可能存在差异,Linux5.4.6返回值-EAGAIN)
  • 如果所有的管道写端对应的文件描述符被关闭,则read返回0;(基于不同版本linux内核返回值可能存在差异,Linux5.4.6返回当前已读取的字节大小)
  • 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出;(基于不同版本linux内核返回值可能存在差异,Linux5.4.6返回值-EPIPE)
  • 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性;
  • 当要写入的数据量大于PIPE_BUF时,linux将不在保证写入的原子性;

匿名管道特点:

  • 只能用于具有公共祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父子进程之间就可应用该管道。
  • 管道提供流式服务(管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等)。
  • 写入管道中的数据遵循先入先出的规则。
  • 一般而言,进程退出,管道释放,所以管道的生命周期随进程。
  • 一般而言,内核会对管道操作进行同步与互斥(写满就不写,读完就不读)。
  • 管道是半双工的(一边进一遍出),数据只能向一个方向流动;需要双方通信时,需要建立两个管道。

#Linux#进程间通信# 管道(pipe)-匿名管道pipe相关推荐

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

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

  2. C++学习:第六章Linux高级编程 - (七)信号、sigqueue、sigaction、IPC、管道、匿名管道

    回顾: 1. 信号的作用 2. 理解信号: 软中断 可靠与不可靠信号 kill -l 3. 信号发送与注册 kill/raise alarm setitimer signal 4. 信号的屏蔽 sig ...

  3. Linux系统编程:pipe匿名管道的使用,实现linux命令下管道命令

    pipe函数介绍 函数原型int pipe(int pipefd[2]) 来创建匿名管道; 传出2个fd 文件描述符,pipefd[0]表示匿名管道的读端,pipefd[1]表示匿名管道的写端.有这个 ...

  4. Linux:进程间通信(创建匿名管道,父子进程间通信,兄弟进程间通信)

    过一遍管道的基础知识: 1.本质:存在于高速缓存区,属于伪文件,不占用磁盘空间.缓冲区大小默认4K,可根据实际情况适当调整 2.读端和写端各自对应一个文件描述符,数据从写端流入,读端流出 3.操作管道 ...

  5. php+管道+pipe管道,C++ 匿名管道执行DOS命令

    最近在开发一个项目.需要PHP Sock连接到服务器中执行DOS 命令 , 所以想到了命名管道 CreatePipe 其函数原型BOOL CreatePipe( PHANDLE hReadPipe, ...

  6. linux 进程间通信及makefile 无名管道/有名管道/共享内存/信号/消息队列

    http://www.voidcn.com/article/p-hxvuiypm-mr.html https://www.cnblogs.com/wuyida/archive/2013/02/03/6 ...

  7. Linux——进程间通信的常见方法(管道、信号、共享映射区、本地套接字)、管道的了解与简单用法

    进程间通信IPC的原理: 常见的进程间通信方式有: 管道(使用最简单) 信号(开销最小) 共享映射区(无血缘关系) 本地套接字(最稳定) 二.管道的特质与基本用法 内核借助环形队列机制,使用内核缓冲区 ...

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

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

  9. 管道 通过匿名管道在进程间双向通信

    参考网址:http://www.xuebuyuan.com/1959215.html 我的测试代码: Pipe_Server_VC6_Console.exe : 1 #include <wind ...

最新文章

  1. SQLite.swift的简单使用
  2. 主营无线部件 高通与TDK创立合资公司
  3. Spring----自定义异常类
  4. Gif(2)-加载视图-波纹
  5. solr7.4 安装与使用
  6. 【ACM】nyoj_305_表达式求值_201308081018
  7. 每天一小时python官方文档学习(七)————模块与包
  8. 多个php 链接数据库,ThinkPHP实现多数据库连接的解决方法
  9. Spark in action on Kubernetes - Playground搭建与架构浅析
  10. python 接口测试 如何写配置文件_python接口自动化测试 - configparser配置文件解析器详细使用...
  11. 统计问题(HDU-2563)
  12. Django登录验证——原生表单验证
  13. HTTP协议 (二) 基本认证
  14. 详解Android中AsyncTask的使用
  15. ios 类别(category)
  16. 2022-2027年(新版)中国产权交易行业前景动态与未来发展形势报告
  17. 饮用水安全与水资源保护
  18. jquery给lable赋值
  19. MTK平台基于EV1527的无线接收和发射程序
  20. Windows10剪切板快捷键

热门文章

  1. 使用httpclient必须知道的参数设置及代码写法、存在的风险
  2. Windows 打开 Docker Desktop 出现错误:Docker failed to initialize
  3. 如何正确安装PARSEC。
  4. 怎么把文字转换成语音,这里有简单的方法
  5. 怎样使用word模板?两分钟教你搞定!
  6. 解决ps默认打开显卡的设置
  7. 输入小写字母转换acii和对应大写
  8. 怎样在群晖中安装GitLab用于项目代码管理
  9. 最大子矩阵和问题java_最大子矩阵
  10. 《增长黑客实战》(第4-6章)