管道及其容量
2016-07-13 14:41
260 查看
1、管道
管道是一种最基本的IPC机制,由pipe函数创建:
#include <unistd.h>
int pipe(int filedes[2]);
调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端。所以管道在用户程序看起来就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]);向这个文件读写数据其实是在读写内核缓冲区。
pipe函数调用成功返回0,调用失败返回-1。
2、分类
1)匿名管道:只能应用于有血缘关系的进程
2)命名管道:应用于不同进程,包括有血缘关系的
3、匿名管道
(1)匿名管道的特点:
1)只支持单向通信
2)只能应用于有血缘关系的进程
3)提供流服务
4)管道的生命周期随进程(管道未关闭在进程结束时管道会自动被关闭)
(2)四种场景
场景一:写端写了一段后不再写入,不关闭写端;读端一直读,读完管道的所有内容后会阻塞,一直到写端再次写入。场景二:写端一直写,读端读了一段时间后停止读取,也不关闭读端,等到管道写满后,会停止写入。场景三:写端一直写,读端读了一段时间后停止读取,并且关闭读端,写端会收到SIGPIE信号,写端异常退出。场景四:写端写了一段后不再写入,并且关闭写端;读端一直读,读完管道所有的内容后,关闭。
4、匿名管道(1)命名管道
管道的一个不足之处是没有名字,因此,只能用于具有亲缘关系的进程间通信,在命名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。值得注意的是,FIFO(first input first output)总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出。
(2)创建
Linux下有两种方式创建命名管道:
一是在Shell下交互地建立一个命名管道,二是在程序中使用系统函数建立命名管道。
(3)特点
1) 既可用于本地,又可用于网络。
2) 可以通过它的名称而被引用。
3) 支持多客户机连接。
4) 支持双向通信。
5) 支持异步重叠I/O操作。
5、管道容量
当管道一端不断地读取数据,另一端却不输出数据。根据linux的实现机制当管道读满是输出端自动阻塞。那么管道的容量是多少呢?
程序:
结果:
当j等于16是阻塞,说明容量为64K。
本文出自 “LOVEMERIGHT” 博客,请务必保留此出处http://lovemeright.blog.51cto.com/10808587/1826069
管道是一种最基本的IPC机制,由pipe函数创建:
#include <unistd.h>
int pipe(int filedes[2]);
调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端。所以管道在用户程序看起来就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]);向这个文件读写数据其实是在读写内核缓冲区。
pipe函数调用成功返回0,调用失败返回-1。
2、分类
1)匿名管道:只能应用于有血缘关系的进程
2)命名管道:应用于不同进程,包括有血缘关系的
3、匿名管道
(1)匿名管道的特点:
1)只支持单向通信
2)只能应用于有血缘关系的进程
3)提供流服务
4)管道的生命周期随进程(管道未关闭在进程结束时管道会自动被关闭)
(2)四种场景
场景一:写端写了一段后不再写入,不关闭写端;读端一直读,读完管道的所有内容后会阻塞,一直到写端再次写入。场景二:写端一直写,读端读了一段时间后停止读取,也不关闭读端,等到管道写满后,会停止写入。场景三:写端一直写,读端读了一段时间后停止读取,并且关闭读端,写端会收到SIGPIE信号,写端异常退出。场景四:写端写了一段后不再写入,并且关闭写端;读端一直读,读完管道所有的内容后,关闭。
4、匿名管道(1)命名管道
管道的一个不足之处是没有名字,因此,只能用于具有亲缘关系的进程间通信,在命名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。值得注意的是,FIFO(first input first output)总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出。
(2)创建
Linux下有两种方式创建命名管道:
一是在Shell下交互地建立一个命名管道,二是在程序中使用系统函数建立命名管道。
(3)特点
1) 既可用于本地,又可用于网络。
2) 可以通过它的名称而被引用。
3) 支持多客户机连接。
4) 支持双向通信。
5) 支持异步重叠I/O操作。
5、管道容量
当管道一端不断地读取数据,另一端却不输出数据。根据linux的实现机制当管道读满是输出端自动阻塞。那么管道的容量是多少呢?
程序:
结果:
当j等于16是阻塞,说明容量为64K。
本文出自 “LOVEMERIGHT” 博客,请务必保留此出处http://lovemeright.blog.51cto.com/10808587/1826069
相关文章推荐
- fedora切换至root账户
- 漫谈MySql中的事务
- 数组合并删除两个相同元素方法
- Android基础知识--Preference的使用
- hdu3979_Monster
- Excel大数据字段导入SQLserver时报截断错误
- Android MediaPlayer 类图和调用关系
- 【资讯分享】云帆加速将P2P技术免费,该服务量级已突破1.5T
- 实现垂直居中的几种方式
- NYOJ 290 动物统计加强版 (字典树)
- HDU1020 Encoding
- Windows环境Qt程序打包发布
- PHP控制输出不缓存头
- swift学习笔记之--类的计算属性
- 更好的 SQL 模式的 10 条规则
- UVA 10387 Billiard
- 后端程序员网上经常搜索的代码及命令
- 500 Lines or Less——导言
- [JZOJ4624] 字符串匹配
- IOS/OSX下利用AVFoundation来dump提取视频解码裸数据详解,提供源码