首页 > 代码库 > 进程间通信——命名管道

进程间通信——命名管道

 概念

  • 管道一个不足之处是没有名字,因此只能用于具有亲缘关系的进程间通信,命名管道(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 读端

技术分享






技术分享

    

本文出自 “zgw285763054” 博客,请务必保留此出处http://zgw285763054.blog.51cto.com/11591804/1850892

进程间通信——命名管道