linux环境下,各进程相互独立,如果想要交换两个进程之间的数据,需要通过内核,在内存中提供一个缓存区,一个进程往缓存区中写数据,一个往缓存区读数据,内核提供的这种机制称为进程间通信(IPC),常见的进程通信有四种:管道(最简单),信号(开销最小),共享映射区(无血缘关系),本地套接字(最稳定)。

(1)管道

管道的特点:本质是一个伪文件(内核缓冲区),两个文件描述符引用(读端和写端),写端写入,读端读出。

管道的原理及实质:内核使用环形队列机制,借助内核缓冲区实现。

     管道的缺点:1)数据自己读不能自己写;2)数据被读走,不在管道存在;3)半双工通信(数据读写不能同时,数据流向唯一);4)有血缘关系的进程间;

创建管道pipe函数:

函数头文件及原型:函数参数为输入参数       成功调用返回0 ,失败返回-1

函数调用成功返回r/w两个文件,无需open,但是需要手动close,其中pipefd[0] -->r,pipefd[1]-->w,可根据读写要求关闭pipe的一端来实现进程通信;

管道中的读写情况有四种:

1)读管道时    1.管道有数据,read返回实际读到的字节数;

2.管道中无数据

1>管道写端全部关闭,read返回0,表示读到文件末尾;

2>官渡写端没有关闭,read阻塞等待数据来;

2)写管道时      1.管道读端全部关闭,进程异常终止

2.管道读端没有关闭

1>管道已满,write阻塞

2>管道未满,write写入数据,返回实际写入的字节数。

使用管道实现父子通信,实现ls |wc -l  ,父进程实现ls.子进程实现wc -l;

使用管道实现兄弟进程通信,兄:ls  弟  wc -l  父 等待回收子进程

(2)FIFO   命名管道(不想关的进程也可以进行通信)

特点:属于基础文件类型的一种,FIFO文件在磁盘上没有数据块,只有用来表示内核的一条通道,各进程可以打开这个文件进行read/write。

创建方式:命令  mkfifo 管道名

库函数 int mkfifo(const char*pathname,mode_t mode);  成功:0 失败 -1;

使用mkfifo创建了一个FIFO,就可以用open打开它,常见的i/o函数都可以作用于fifo.

如博客https://blog.csdn.net/superywf/article/details/73438465的例子使用如下:

linux操作系统进程间通信IPC之管道pipe及FIFO相关推荐

  1. linux操作系统进程间通信IPC之共享存储映射

    (1)文件存储映射I/O(Memory-mapped I/O) 一个磁盘文件与存储空间中的一个缓存区相对应,这样可以在不适合read/write函数的情况下,使用地址(指针)完成I/O操作.具体实现通 ...

  2. linux进程间通信:无名管道 pipe

    文章目录 内核层实现 结构 通信原理 特点 使用 函数声明 使用实例 单向通信 双向通信 编程注意事项 管道中无数据时读操作会阻塞 将管道的写端句柄关闭,不会影响读端数据读取 管道中没有数据,写操作关 ...

  3. Linux进程+进程间通信IPC

    一 Linux进程 1) 进程的内存映像 2)解释 BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Bloc ...

  4. Linux系统编程---4(进程间通信IPC,管道)

    进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源. 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时 ...

  5. linux进程间通信(IPC) ---无名管道

    管道概述 管道(pipe)又称无名管道 无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符 任何一个进程在创建的时候,系统都会,给它分配4G的虚拟内存,分为3G的用户空间和1G的内核空间 ...

  6. linux:进程间通信 IPC

    文章目录 1.管道 1.1.匿名管道 1.2.有名管道 2.信号 3.共享内存 3.1.共享内存接口 3.1.1.生成 key 值 3.1.2.创建共享内存 3.1.3.创建共享内存映射 3.1.4. ...

  7. linux操作系统理解-IPC

    (IPC指进程间通信方式,注意不是线程间,线程之间同步只有信号量和互斥量) 1.管道Pipe shell的管道就是这个原理 进程管道:popen/pclose函数 1.2命名管道FIFO,是一种特殊的 ...

  8. 【Linux】进程间通信1-匿名管道1

    文章目录 管道符[|] 创建匿名管道的pipe函数 从内核角度深入理解管道 代码验证pipe函数 管道和子进程的先后创建顺序 代码实现父子进程的通信 管道的特性 前言 为什么需要进程间通信呢? 每一个 ...

  9. 【Linux】进程间通信 - 匿名/命名管道与System V共享内存

    目录 前言 一.管道 0.什么是管道 1).管道的概念 2).管道的本质 3).管道指令: "|" 1.匿名管道 1).如何创建匿名管道 2).如何使用匿名管道进行通信 3).匿名 ...

最新文章

  1. JAX-WS使用Handler实现简单的WebService权限验证
  2. Redis学习手册(实例代码)
  3. Linux 内核101:[译]并发导论
  4. 如何捕获window.print点击打印或取消_视频:手把手教您如何优化喷墨波形
  5. 苹果侧边滑动返回_后置指纹、侧边指纹、屏幕指纹到底哪个更好用? 来讨论一下!...
  6. 工作工资不高,很普通的一个我
  7. 把矩阵变为0,1矩阵
  8. 建立矩阵 reshape函数,pascal函数,magic函数,diag函数【Matlab】
  9. C语言程序设计答何钦铭答案,c语言程序设计何钦铭课后题答案
  10. 获得android手机root权限,安卓手机root助手教你一键获取手机root权限
  11. 注册时添加学号Idnumber
  12. 仓储室内定位系统—企业物流的“数字化”转型
  13. Unloaded branch node detected. “loadOptions“ prop is required to load its children.
  14. EasyPR--一个开源的中文车牌识别系统
  15. ValueError: array must not contain infs or NaNs
  16. csapi matlab,Matlab函数csapi与papi的区别是什么
  17. 《基于数字孪生的产品生命周期绿色制造新模式》2019年6月 陶飞等
  18. (转载)阿里云服务器--学生优惠版购买以及配置方法(Windows操作系统)
  19. 【Unity】Rigibody——刚体加力、刚体加扭矩力、刚体加力的几种模式
  20. Browsersync:省时的浏览器同步测试工具

热门文章

  1. Qt学习之路(4):初探信号槽
  2. 阅读react-redux源码(二) - createConnect、match函数的实现
  3. Codeforces Round #556 (Div. 1)
  4. 解决python中join路径分隔符跨平台移植性
  5. 运用Arc Hydro提取河网
  6. wcf rest系列文章
  7. codeforces 732/D 二分
  8. Gentoo - ssh-agent配置
  9. java csf_WebService CSF使用详解 | 学步园
  10. ntp如何确认与服务器偏差_LED电子时钟显示屏如何实现时间同步统一校时?