码迷,mamicode.com
首页 > 其他好文 > 详细

管道及其容量

时间:2016-07-13 23:39:30      阅读:383      评论:0      收藏:0      [点我收藏+]

标签:管道

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

管道及其容量

标签:管道

原文地址:http://lovemeright.blog.51cto.com/10808587/1826069

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!