进程间通信——管道

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文件名的宏的值对换一下


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