UNIXLINUX管道的通信方式.docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UNIX/LINUX 管道的通信方式 对管道的了解: 管道是 Unix 操作系统最强大和最具特色的性能之一,从功能上讲,管 道机制提供了一种在各进程之间大量传输信息的通道;而从本质上讲, 管道是一个特殊的文件。管道是以 Unix 文件系统为基础而设计的,它 具有对普通文件操作的一般特性,如用于普通文件的打开( OPEN )、 读(READ)、写(WRITE)、关闭(CLOSE)等系统调用同样可以作 用于管道。 Unix操作系统下的管道分为无名管道(PIPE)和有名管道(FIFO)两 种,它们在不同的领域下有效地完成了相关进程之间的数据共享和信息 交换,从而保证了进程间的协同工作。与 Unix 系统提供的其他进程通 信机制,如信号(SIGNAL)、消息传送(MESSAGE PASSING )、共 享内存( SHARED MEMORY )等相比,管道机制具有如下三个突出的 特点: ( 1)发送进程能以比较简单的方式,源源不断地把产生的消息以自然流 的方式写入管道,而不需要考虑对每次传送的信息长度的限制。 ( 2)接收进程能在适当的时机从管道按需提取信息,同样也不必以固定 的消息长度为单位进行 3)发送和接收进程都能以一定的方式了解对方进程是否存在,并且可 以通过管道的现存消息情况(管道空、管道有信息、管道满)等相互协 调动作。 管道允许在进程之间按先进先出的方式传送数据,管道也能使进程同步 执行。管道传统的实现方式是通过文件系统作为存储数据的地方。 管道有两种类型:一种是无名管道,简称为管道;另一种是有名管道, 也称为 FIFO。 进程使用系统调用 open 来打开又名管道,使用系统调用 pipe 来建立无 名管道。使用无名管道通信的进程,必须是发出 pipe 调用的进程及其 子进程。使用有名管道通讯的进程没有上述限制。 无名管道( PIPE) 无名管道是一个特殊的打开文件,只能在程序中由系统调用 PIPE( P) 生成。其中参数 P 的定义为: INT P[2] ; 无名管道由一个在基本文件系统存储设备上的 INODE ,一个与其相连的 内存 INODE ,两个打开文件控制块(分别对应管道的信息发送端和信息 接收端)及其所属进程的描述信息来标识,在系统执行 PIPE (P)命令 行之后生成。在P[0]中返回管道的读通道打开文件描述符;在 P[1]中返 回管道的写通道打开文件描述符。从结构上看,无名管道没有文件路径 名,不占用文件目录项,因此文件目录结构中的链表不适用于这种文 件,它只是存在于打开文件结构中的一个临时文件,随其所依附的进程 的生存而生存,当进程终止时,无名管道也随之消亡。 有名管道( FIFO ) 无名管道存在着如下两个严重的缺点: 第一、无名管道只能用于连接具有共同祖先的进程; 第二、无名管道是依附进程而临时存在的,并不是永久存在于系统中。 为了弥补无名管道的不足,伴随 Unix SYSTEM III 的出台推出了一种无 名管道的变种一一有名管道,它常被称为 FIFO。有名管道除继承了无名 管道的所有特性优点之外,还摒弃了无名管道的两个缺点。首先, FIFO 是一种永久性的机构,它具有普通的 Unix 系统文件名。在系统下可利 用 MKNOD 命令建立永久的管道,除非刻意删除它,否则它将一直保持 在系统中。其次,正是由于有名管道以文件名来标识,所以只要事先约 定某一特定文件名,那样所有知道该约定的服务进程,不论它们之间是 否有亲属关系,都可以方便地利用管道进行通信。 FIFO 有两种建立方式: 1)在系统命令级建立 FIFO: $/ETC/MKNOD FIFO P 其中参数 P 用以标识建立一个管道特殊文件。 2)在程序中建立 FIFO: MKNOD (“ FIFO”, 010600 ,0); 其中八进制数“ 010600 ”用以标识建立一个 FIFO 文件。 FIFO 和无名管道在系统内核层合用了大量的代码段,它的读、写流程与 无名管道的读、写流程基本一致。值得注意的是, Unix 系统规定,为了 资源利用的合理性,如果没有进程在某 FIFO 用于写之前打开时,有进 程先打开 FIFO 用于读的话,那样该读进程将被阻塞,直到有另一个进 程打开该 FIFO 用于写,反之亦然。解决这一问题的最好方法是推出一 个后台进程将该 FIFO 以读、写双重的方式打开操作。 pipe 系统调用: 系统调用 pipe 是用来建立管道的。该调用的声明格式如下: int pipe(int filedes[2]); 在使用该调用的程序中加入下面的头文件: #include unistd.h 一个管道拥有两个文件描述符用来通信,它们指向一个管道的索引节 点,该调用将这两文件描述符放在参数 filedes 中返回。现在的许多系 统中管道允

文档评论(0)

cooldemon0602 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档