|
|
田 嵘 张 昊 电子部第54研究所侦察对抗测量专业部 摘 要:本文深入剖析了在UNIX操作系统下的一种高级的进程间通信机构----管道的工作机理,及其应用。 关键词:管道 进程 进程通信 后台作业 1 管道的概念及其特点 管道是UNIX操作系统最强大和最具特色的性能之一,最初接触UNIX系统的操作员对管道这一机构既感到兴奋又感到迷惑。兴奋于管道功能的强大性及其使用的广泛性,无论是程序员开发的应用程序还是UNIX操作系统本身提供的各种命令,只要它们从系统的标准输入读,向系统的标准输出写,并完成一指定的任务,那都可以利用管道机构将它们顺利地连接起来构成复杂的命令行,以完成更强大的组合功能。在兴奋的同时,大多数程序员又对如何使用这一通讯机构感到迷惑。 从功能上讲,管道机构提供了一种在各种进程《家族进程,非家族进程》之间大量传输信息的通道;而从本质上讲,管道是一个特殊的文件。这是由于,管道机构是以U-NIX文件系统为基础而设计的,它具有对普通文件操作的一般特性,如用于普通文件的打开(OPEN),读(READ),写(WRITE),关闭(CLOSE)等系统调用同样可以作用于管道,不同之处在于,UNIX操作系统设置了专门的机构来协调使用管道的发送和接收进程之间的动作,使这些并发进程之间能顺利地完成各种交互工作。 UNIX操作系统下的管道分为无名管道(PIPE)和有名管道(FIFO)两种,它们在不同的领域下有效地完成了相关进程之间的数据共享和信息交换,从而保证了进程间协同工作。与UNIX系统提供的其他进程通信机构,如信号(SIGNAML),消息传送(MESSAGE PASSING),共享内存(SHARED MEMORY)等相比,管道机构具有如下三个突出的特点: (1)发送进程能以比较简单的方式,源源不断地把产生的消息以自然流的方式写入管道,而不需要考虑对每次传送的信息长度的限制。 (2) 接收进程能在适当的时机从管道按需提取信息,同样也不必以固定的消息长度为单位进行。 (3) 发送和接收进程都能以一定的方式了解对方进程是否存在,并且可以通过管道的现存消息情况(管道空、管道有信息、管道满)等相互协调动作。 管道技术是在较早期UNIX版本中提出的,随着SVID的公布,在新版的UNIX中又增加了诸如记录锁定(RECORD LOCKING),信号量(SEMAPHORES)等新的进程通信机构,但正是由于管道所具有的以上几条不可取代的功能特性,使它成为所有UNIX版本中必须支持的基础进程通信手段之一。 2 无名管道(PIPE) 2.1无名管道的生成 无名管道是一个特殊的打开文件,只能在程序中由系统调用PIPE(P)生成。其中 参数P定义如下: INT P[2]; 无名管道由一个在基本文件系统存储设备上的INODE,一个与其相连的内存INODE,两个打开文件控制块(分别对应管道的信息发送端和信息接收端)及其所属进程的描述信息来标识,在系统执行PIPE(P)命令行之后生成。并在P[0]中返回管道的读通道打开文件描述等,在P[1]中返回管道的写通道打开文件描述符。从结构上看,无名管道没有文件路径名,不占用文件目录项,因此文件目录结构中的链表不适用于这种文件,它只是存在于打开文件结构中的一个临时文件,随其所依附的进程的生存而生存,当进程终止时,无名管道也随之消亡。 2.2无名管道的读写同步与互斥 图1给出了两个进程(A,B)使用管道的工作示意。从图中可以看到送入管道的信息一旦被读进程取用就从管道中消失了,读写操作之间符合先进先出的队列原则。 管道文件是进程间通信的工具,为了尽量少的占用系统存储资源,一般系统均将其限制为最大长度为4096(PIPSIZ)字节的小型文件。当欲写入的消息超过4096字节时,就产生了读、写进程之间的同步问题。首先写操作查找PIPE文件中当前指针的偏移量F-OFFSET,然后从此位置开始尽量写入信息,当长度达到4096字节时,系统控制写进程进入睡眠状态,一直等待读进程取走全部信息时,文件长度指针置0,写进程才被唤醒继续工作。 为防止多个进程同时读写一个管道文件而产生混乱,在管道文件的INODE标志字I-FLAY项中设置了ILOCK标志项,以设置软件锁的方式实现多进程间对管道文件的互斥使用。对管道文件的读、写流程如图2、图3所示。 3 有名管道(FIFO) 3.1 设置有名管道的必要性 从上面的论述中我们可以看出UNIX系统下的管道提供了一种功能很强的进程间的通信机构,但是同时,无名管道存在着如下两个严重的缺点。 第一, 无名管道只能用于连接具有共同祖先的进程。由于无名管道是在程序中建立的,系统伴随无名管道的生成而分配随机的读/ 写文件描述符,程序的每一次运行其读/写文件描述符均不相同,只有靠父子进程间的继承关系才能传递管道文件描述符,这样就导致只有亲属进程间才能使用同一无名管道。这一缺点是程序员在开发全系统范围内的服务程序时所不能忍受的。如网络控制服务程序要求各进程在并发执行的同时利用管道与其他服务进程进行通信,然后再脱离,这是利用无名管道无法实现的。 第二、 无名管道是依附进程而临时存在的。无名管道随其所依附的进程的生存而生存,当进程终止时,无名管道也随之消亡,它不是永久存在于系统中的。 为了弥补无名管道的不足,伴随UNIX SYSTEM III的出台推出了一种无名管道的变种-有名管道,它常被称为FIFO。有名管道除继承了无名管道的所有特性优点之外,还屏弃了无名管道的两个缺点。 首先,FIFO是一种永久性的机构,它具有普通的UNIX系统文件名。在系统下可利用MKNOD命令建立永久的管道,除非刻意删除它,否则它将一直保持在系统中。 其次,正是由于有名管道以“文件名”来标识,所以只要事先约定某一特定文件名,那样所有知道该约定的服务进程,不论它们之间是否有亲属关系,都可以便利地利用管道进行通信。 3.2FIFO的使用 FIFO不同于无名管道,它有两种建立方式。在系统命令级建立FIFO: ¥/ETC/MKNOD FIFO P 其中参数P用以标识建立一个管道特殊文件。在程序中建立FIFO: MKNOD(“FIFO”,010600,0); 其中八进制数“010600”用以标识建立一个FIFO文件。 FIFO和无名管道在系统内核层合用了大量的代码段,它的读、写流程与无名管道的读、写流程基本一致,在此不再冗述了。值的注意的是,UNIX系统规定,为了资源利用的合理性,如果未有进程打开某FIFO用于写之前,而有进程打开FIFO用于读的话,那样该读进程将被阻塞,直到有另一个进程打开该FIFO用于写,反之亦然。解决这一问题的最好方法是推出一个后台进程将该FIFO以读、写双重的方式打开操作。 4 UNIX系统下几种进程通信机构的比较 在最初的UNIX版本中只有三种进程通信手段:信号(SIGNAL)、管道(PIPE)和FIFO。随着UNIX自身的不断改进完善,在SVID中有定义了四种新的进程通信手段:记录锁定(RECORDING LOCKING)、消息传送(MESSAGE PASSING)、信号量(SEMAPHORES)、共享内存(SHANRED MEMORY),这些通信机构各有优势,在本文的最后我们利用列表分析一下它们彼此的特点。 参考文献 1.尤晋元。UNIX操作系统教程。西北电讯工程学院出版社,1987 2.钱培德。UNIX系统程序设计技术。计算机科学技术与应用编辑部,1990.9 |
| 返回目录 | |