linux操作系统进程间通信IPC之管道pipe及FIFO
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相关推荐
- linux操作系统进程间通信IPC之共享存储映射
(1)文件存储映射I/O(Memory-mapped I/O) 一个磁盘文件与存储空间中的一个缓存区相对应,这样可以在不适合read/write函数的情况下,使用地址(指针)完成I/O操作.具体实现通 ...
- linux进程间通信:无名管道 pipe
文章目录 内核层实现 结构 通信原理 特点 使用 函数声明 使用实例 单向通信 双向通信 编程注意事项 管道中无数据时读操作会阻塞 将管道的写端句柄关闭,不会影响读端数据读取 管道中没有数据,写操作关 ...
- Linux进程+进程间通信IPC
一 Linux进程 1) 进程的内存映像 2)解释 BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Bloc ...
- Linux系统编程---4(进程间通信IPC,管道)
进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源. 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时 ...
- linux进程间通信(IPC) ---无名管道
管道概述 管道(pipe)又称无名管道 无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符 任何一个进程在创建的时候,系统都会,给它分配4G的虚拟内存,分为3G的用户空间和1G的内核空间 ...
- linux:进程间通信 IPC
文章目录 1.管道 1.1.匿名管道 1.2.有名管道 2.信号 3.共享内存 3.1.共享内存接口 3.1.1.生成 key 值 3.1.2.创建共享内存 3.1.3.创建共享内存映射 3.1.4. ...
- linux操作系统理解-IPC
(IPC指进程间通信方式,注意不是线程间,线程之间同步只有信号量和互斥量) 1.管道Pipe shell的管道就是这个原理 进程管道:popen/pclose函数 1.2命名管道FIFO,是一种特殊的 ...
- 【Linux】进程间通信1-匿名管道1
文章目录 管道符[|] 创建匿名管道的pipe函数 从内核角度深入理解管道 代码验证pipe函数 管道和子进程的先后创建顺序 代码实现父子进程的通信 管道的特性 前言 为什么需要进程间通信呢? 每一个 ...
- 【Linux】进程间通信 - 匿名/命名管道与System V共享内存
目录 前言 一.管道 0.什么是管道 1).管道的概念 2).管道的本质 3).管道指令: "|" 1.匿名管道 1).如何创建匿名管道 2).如何使用匿名管道进行通信 3).匿名 ...
最新文章
- JAX-WS使用Handler实现简单的WebService权限验证
- Redis学习手册(实例代码)
- Linux 内核101:[译]并发导论
- 如何捕获window.print点击打印或取消_视频:手把手教您如何优化喷墨波形
- 苹果侧边滑动返回_后置指纹、侧边指纹、屏幕指纹到底哪个更好用? 来讨论一下!...
- 工作工资不高,很普通的一个我
- 把矩阵变为0,1矩阵
- 建立矩阵 reshape函数,pascal函数,magic函数,diag函数【Matlab】
- C语言程序设计答何钦铭答案,c语言程序设计何钦铭课后题答案
- 获得android手机root权限,安卓手机root助手教你一键获取手机root权限
- 注册时添加学号Idnumber
- 仓储室内定位系统—企业物流的“数字化”转型
- Unloaded branch node detected. “loadOptions“ prop is required to load its children.
- EasyPR--一个开源的中文车牌识别系统
- ValueError: array must not contain infs or NaNs
- csapi matlab,Matlab函数csapi与papi的区别是什么
- 《基于数字孪生的产品生命周期绿色制造新模式》2019年6月 陶飞等
- (转载)阿里云服务器--学生优惠版购买以及配置方法(Windows操作系统)
- 【Unity】Rigibody——刚体加力、刚体加扭矩力、刚体加力的几种模式
- Browsersync:省时的浏览器同步测试工具
热门文章
- Qt学习之路(4):初探信号槽
- 阅读react-redux源码(二) - createConnect、match函数的实现
- Codeforces Round #556 (Div. 1)
- 解决python中join路径分隔符跨平台移植性
- 运用Arc Hydro提取河网
- wcf rest系列文章
- codeforces 732/D 二分
- Gentoo - ssh-agent配置
- java csf_WebService CSF使用详解 | 学步园
- ntp如何确认与服务器偏差_LED电子时钟显示屏如何实现时间同步统一校时?