加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux进程间通信(三) 管道通信之有名管道及其基础实验 - Linux系统

发布时间:2013-12-08 11:47:24 所属栏目:Linux 来源:站长网
导读:有名管道(FIFO) 首先将上一节的有关有名管道的定义再贴出来 有名管道是对无名管道的一 种改进,它具有以下特点: ① 它可以使互不相关的两个进程间实现彼此通信
有名管道(FIFO)

首先将上一节的有关有名管道的定义再贴出来

有名管道是对无名管道的一 种改进,它具有以下特点:

①  它可以使互不相关的两个进程间实现彼此通信;

②  该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它 当做普通文件一样进行读写操作,使用非常方便;

③  FIFO严格地遵循先进先出规则,对管道及 FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作 。

有名管道的创建可以使用函数 mkfifo(),该函数类似与文件中的 open()操作,可以指定管道的路 径和打开的模式。咱们还可以在命令行使用“mknod 管道名 p”来创建有名管道。

在管道创建成功后 ,就可以使用open()、write()和read()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可 在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞 问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以 在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。

对于读进程 :

若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入 。

若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果 FIFO内没有数据,则读函数将立刻返回0。

对于写进程:

若该管道是阻塞打开,则写 操作将一直阻塞到数据可以被写入。

若该管道是非阻塞打开而不能写入全部数据,则读操作 进行部分写入或者调用失败。

下表列出了mkfifo()函数的语法要点

为了方便咱们查错,再对FIFO相关的出错信息进行归纳,如下表:

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读