管道通信(进程间通信——管道)

精英怪
广告

进程间通信——管道

管道通信(进程间通信——管道)

1.管道的概念

管道是一种两个进程间进行单向通信的机制。注意,传递数据是单向的,故管道又称为半双工管道。

2.管道的特点

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

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

3.管道的局限性

(1)数据只能向一个方向流动,需要双方通信时,需要建立起两个管道;

(2)只能用于具有亲缘关系的进程(比如,父进程和子进程之间);

(3)管道没有名字,并且缓冲区大小是受限制的。

例:

运行结果:

即父子进程间的通信,父进程负责将数据写入管道,子进程负责读取管道中的内容。

4.有名管道

由于管道的一个不足之处就是没有名字,所以只能够让有亲缘关系的进程进行通信。因此,后来又有人提出了有名管道,不同于无名管道的是,它提供了一个路径名与之关联,并且以FIFO的文件形式存储于文件系统中。(名字存在于文件系统中,内容存放在内存中。)

之所以称之为FIFO,是因为它严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。

例:下面通过mkfifo创建一个有名管道,实现client与server之间的通信

server.c

Client.c

运行结果:

打开两个终端,一个终端运行sercer.c,另一个终端运行client.c,如下:

上述结果表明该有名管道已创建成功,并可实现简单的通信。但是要注意,要对FIFO文件的读写顺序颠倒一下,也就是将定义FIFO文件名的宏的值对换一下

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,287人围观)

还没有评论,来说两句吧...