标签:管道
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)特点
5) 支持异步重叠I/O操作。
5、管道容量
当管道一端不断地读取数据,另一端却不输出数据。根据linux的实现机制当管道读满是输出端自动阻塞。那么管道的容量是多少呢?
程序:
结果:
当j等于16是阻塞,说明容量为64K。
本文出自 “LOVEMERIGHT” 博客,请务必保留此出处http://lovemeright.blog.51cto.com/10808587/1826069
标签:管道
原文地址:http://lovemeright.blog.51cto.com/10808587/1826069