
转发自:
在上一篇文章[Linux进程间通信]-Anonymous Pipe中,我们介绍了Linux / Unix系统中最古老的进程间通信方法-Anonymous Pipe. 此外,我们还解释了匿名管道的一些局限性,特别是匿名管道只能在父进程和子进程或同级进程之间使用,而不能在不相关的进程之间交换数据. 为了克服匿名管道的这种限制,有人提出了一种称为命名管道(FIFO)的进程间通信方法. 今天我们将介绍这种通信方式.
在上一篇文章中,我们说过,为了实现进程间的通信,必须提供一种介质,以便双方的进程都可以访问它. 该介质甚至可以是磁盘上的普通文件. 但是对于计算机而言,读写普通文件的效率太低,无法满足进程之间信息交换的实时性要求. 是否可以提供有效的特殊文件作为进程间通信的介质?您可以简单地将我们今天介绍的命名管道视为一个特殊文件. 命名管道也称为FIFO文件,它是一种特殊的文件类型,它提供与之关联的路径名,并且作为FIFO文件存在于文件系统中. 这意味着我们可以在文件系统中看到命名管道. 使用这样的“中”文件创建命名管道,对于两个不相关和不相关的进程,只要他们可以访问该文件,它们就可以彼此通信. 更方便的是,由于命名管道也是一种文件,因此我们对此类文件的操作与普通文件相同,非常方便.
命名管道的特性不同于匿名管道. 总之,有两个要点:
1,匿名管道只能用于相关的两个进程之间的通信,而命名管道可以用于任何两个进程之间的通信,这更加灵活和方便.

2. 尽管命名管道克服了匿名管道只能在相关的两个进程之间使用的局限性,但是它们并没有克服匿名管道只能以半双工通信的缺点. 换句话说,命名管道通常是半双工通信方法.
3,命名管道是一种特殊的文件类型,它存在于文件系统中. 因此,在使用命名管道完成通信过程之后,如果未删除该文件,则该文件仍然存在. 匿名管道仅存在于内存中,无法在文件系统中查看.
创建命名管道类似于创建普通文件,其功能原型如下:
#include
#include

int mkfifo(constchar *文件名,mode_t模式);
mkfifo函数的第一个参数是路径名,它是成功创建命名管道后的文件名. 第二个参数与打开普通文件的打开功能中的mode参数相同. 如果创建成功,则返回0,否则返回-1.
下面的示例演示如何创建命名管道:

命名管道也是(特殊)文件类型,需要在访问文件之前将其打开. 与其他普通文件一样,使用open函数打开命名管道.

值得注意的是,您不能在O_RDWR(读取和写入)模式下打开命名管道,而只能在“读取”或“写入”模式下打开命名管道文件. 开放规则如下:
当前进程以“写入”模式打开命名管道(并且设置了阻塞标志)时,如果另一个进程以“读取”打开命名管道,则当前的打开操作成功返回,否则将一直阻塞直到一个进程打开了命名管道以进行“读取”.
当前进程在“读取”模式下打开命名管道(并且设置了阻塞标志)时,如果另一个进程为“写入”打开了命名管道,则当前的打开操作成功返回,否则将一直阻塞直到一个进程打开了“写”管道.
打开命名管道后,您可以对其进行读写. 命名管道的操作与普通文件类似: 使用读写功能读取和写入,并使用close函数关闭命名管道.
下面,我们使用上面创建的myfifo文件演示命名管道的读写操作.


fife_write.c

fife_read.c
我们之前说过,当一个进程打开一个用于“写入”的命名管道时创建命名管道,如果没有其他进程打开它以进行“读取”,它将阻塞直到另一个进程将其打开以进行“读取”. 为了更清楚地了解此过程,我们首先运行写入过程. 没有“打开
成功”输出,打开功能中的写入过程已被阻塞. 接下来我们运行读取过程,您会看到写入过程输出“打开成功”,并且打开操作返回.
如果要删除使用的FIFO文件,则需要unlink命令,示例如下:

取消链接
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-288050-1.html
002515
分分钟搞垮那什么
也必须要留出公共空间以利大家通行的