管道

来源:互联网 发布:淘宝瘦身贴有用吗 编辑:程序博客网 时间:2024/04/28 04:52

   管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

   管道是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享方式,又称pipe文件。

 

管道的特点:

l 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;

l 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);

l 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。

l 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

 

管道的创建:

#include <unistd.h>

int pipe(int fd[2])

该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义,因此,一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信。

 

管道的读写规则:

 管道两端可分别用描述字fd[0]以及fd[1]来描述。

 管道的一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。

 如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。

一般文件的I/O函数都可以用于管道,如closereadwrite等等。

系统文件 write(fd[1],buf,size)

功能:把buf中的长度为size字符的消息送入管道入口fd[1]

fd[1]——pipe入口

buf:存放消息的空间

size:要写入的字符长度

系统文件 read(fd[0],buf,size)

功能:从pipe出口fd[0]读出size字符的消息置入buf中。

fd[0]――pipe的出口

 

例如:父进程fork一个子进程后,子进程把字符串写到管道中,父进程从管道中读取字符串