Chinaunix首页 | 论坛 | 博客
  • 博客访问: 52214
  • 博文数量: 17
  • 博客积分: 1471
  • 博客等级: 上尉
  • 技术积分: 155
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-27 11:44
文章分类

全部博文(17)

文章存档

2012年(1)

2011年(1)

2008年(15)

我的朋友

分类:

2008-05-27 11:52:05

管道相关的关键概念
    管道是Linux支持的最初Unix IPC形式之一,具有以下特点:
        * 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;
        * 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
        * 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
        * 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

管道的创建:
    #include
    int pipe(int fd[2])
    该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义,因此,一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过 管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。


管道的读写规则:
    管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为 管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般 文件的I/O函数都可以用于管道,如close、read、write等等。
    从管道中读取数据:
        * 如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0;
        * 当管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节数目不大于 PIPE_BUF,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求的字节数(此时,管道中数据量不小于请求的数据 量)。
        
        向管道中写入数据:
    * 向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据,那么写操作将一直阻塞。
      注:只有在管道的读端存在时,向管道中写入数据才有意义。否则,向管道中写入数据的进程将收到内核传来的SIFPIPE信号,应用程序可以处理该信号,也可以忽略(默认动作则是应用程序终止)。


管道的主要局限性正体现在它的特点上:
    * 只支持单向数据流;
    * 只能用于具有亲缘关系的进程之间;
    * 没有名字;
    * 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);
    * 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;

转载:http://blog.chinaunix.net/u/16292/showart_393612.html
阅读(701) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:有名管道读写实例(转载)

给主人留下些什么吧!~~