概念
管道一个不足之处是没有名字,因此只能用于具有亲缘关系的进程间通信,命名管道(named pipe或FIFO)解决了这一问题。
FIFO提供一个路径名与之关联,以FIFO文件的形式存储于文件系统中。文件系统中路径名是全局的,各进程都可以访问,因此可以用文件系统中的路径名来标识一个IPC通道。
对文件系统来说,匿名管道(管道)是不可见的,它的作用仅限于在父进程和子进程两个进程间进行通信。而命名管道是一个可见的文件,因此,他可以用于任意两个进程间进行通信,不管这两个进程是不是父子进程,也不管这两个进程之间有没有关系。
FIFO总是按照先进先出(First Input First Output)的原则工作,第一个被写入的数据将首先从管道中读出。
由于Linux中所有的事物都可被视为文件,所以对命名管道的使用也就变得与文件操作非常的统一,也使它的使用非常方便,同时我们也可以像平常的文件名一样在命令中使用。
创建命名管道
Linux下有两种方式创建命名管道。
使用mkfifo命令在Shell下交互地创建一个命名管道。
在程序中使用mkfifo系统调用函数创建命名管道。
pathname是创建的命名管道的全路径名,mode为创建命名管道的模式,指明它的读写权限。成功时返回0,失败时返回-1并创建相应的错误码。
使用命名管道
命名管道创建后就可以使用了,命名管道和管道的使用方法基本是相同的,只是使用命名管道时,必须先用open()将它打开。因为命名管道是一个存在于硬盘上的文件,而管道是存在于内存中的特殊文件。
需要注意的是,调用open()打开命名管道的进程可能被阻塞,①但如果同时用读写方式(O_RDWR)打开,则一定不会导致阻塞;②如果以只读(O_RDONLY)方式打开,则调用open()函数的进程会被阻塞直到有写方打开管道;③如果以写方式(O_WRONLY)打开,也会阻塞直到有读方打开管道。
代码
FIFO 写端
FIFO 读端
转载于:https://blog.51cto.com/zgw285763054/1850892