- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网络程序设计教材第十二章流
第十二章 流
12.1流(STREAMS)概述
12.1.1 流
流由Dennis Ritchie在1984年设计,并于1986年随SVR3首次得以广泛使用。Posix未对它进行标准化。Unix98要求的基本流函数包括:getmsg、getpmsg、putmsg、putpmsg、fattach,以及所有的流ioctl命令。XTI通常用流实现。所有源自系统V的系统都应提供流,但4.xBSD版本并不提供流。
流是一种通用、灵活的设施和用于开发UNIX系统通信服务的一组工具。它在很大范围内支持多种服务的实现,从完整的网络协议包到单独一个设备驱动程序。流定义用于内核中的字符输入和输出,以及内核和UNIX系统其余部分之间的标准界面。相关的机制是简单而且开放的。它由一组系统调用、内核资源和内核例程组成。
这种标准界面和机制使得高性能的网络服务和它们的组成成分能够实现模块化。可以移植开发和容易集成。流并不局限于任何特殊的网络体系结构。流用户界面与open、close、read、write和ioctl等用户层字符I/O函数向上兼容。
流是在内核空间中的STREAMS驱动程序与用户空间中的进程之间的一种全双工处理和数据传输通道,如图12-1所示。在内核中,流通过连接流首、驱动程序以及它们之间的0个或者多个模块而构成。流首是流最靠近用户进程的那一端。由流上用户层进程发出的所有系统调用都由流首处理。
管道也是基于STREAMS的。基于STREAMS的管道是内核中一种全双工的数据传输通道,如图12-2所示。它实现了内核与一个或几个用户进程间的连接,也具有基于STREAMS设备的优点。
STREAMS驱动程序可以是提供外部I/O设备服务的一种设备驱动程序;也可以是一种软件驱动程序,通常这种驱动程序称为伪设备驱动程序。这种设备驱动程序主要处理内核与设备之间的数据传输。除了STREAMS机制使用的数据结构与该设备理解的数据结构间的转换之外,它很少或者根本不处理别的数据。
STREAMS模块提供流的数据流程上实施的处理功能。模块定义成一组用于处理数据、状态以及控制信息的内核层例程和数据结构。数据处理可能涉及修改数据表示的方式,在数据上添加或删除前导或后续信息以及打包或拆包数据。状态和控制信息包括信号和输入、输出控制信息。每个模块是自我封闭的,而且除了它的两个相邻成分外,在功能上它与该流中所有其它成分隔绝。模块通过传递消息与它的相邻成分通信。模块并不是STREAMS中的必要成分,但除了基于STREAMS的管道(只需要流首)外,驱动程序是需要的。
在流首和驱动程序之间可以插入一个或者多个模块,以便在流首和驱动程序之间传递消息时对其进行中间处理。STREAMS模块由用户进程在流中动态地互连。创建这种连接不需要内核编程、汇编或连接编辑。
STREAMS使用队列结构,以保持与压入的模块或打开的STREAMS设备有关的信息。队列是一种数据结构,它包含状态信息,一个指向处理消息的若干个例程的指针以及用于管理流的若干指针。队列总是成对分配,一个用于读端,另一个用于写端。每一个驱动程序、模块以及流首各有一个队列对。只要打开流或者把模块压入(加入)到流中,就分配队列对。
数据以消息的形式在驱动程序和流首之间以及在模块之间传递。消息是一组数据结构,它们用于在用户进程、模块和驱动程序之间传递数据、状态和控制信息。从流首向驱动程序,或者从进程向设备传递的消息称之为顺流传播;类似地,消息以另一个方向传递,即从设备向进程或从驱动程序向流首方向传递,称之为逆流传播。
一个STREAMS消息由一个或多个消息块构成。每个块是由首部、数据块和数据缓冲区组成的三元组,流首在用户进程的数据空间和STREAMS内核数据空间之间传递数据。用户进程发送给驱动程序的数据被打包成STREAMS消息,然后顺流传递。当包含数据的消息经由逆流到达流首时,此消息由流首处理,它把数据复制到用户缓冲区中。
在流内部,消息由类型指示符区分。逆流发送的某些消息类型可能导致流首执行特定的动作,例如发送一个信号给用户进程。其它消息类型主要在流内部传送信息,这些消息对用户进程来讲是透明的。
12.1.2 流的基本操作
流驱动程序类似于传统的字符I/O驱动程序,在文件系统中它有一个或多个与其相关的节点,并且用open系统调用存取它。典型的情况是,每一个文件系统节点对应于该驱动程序的一个独立的次设备。打开一个驱动程序的不同的次设备将导致一个独立的流在用户进程和该驱动程序间连接起来。由open调用返回的文件描述符用于对该流作进一步的访问。若打开相同的次设备一次以上,则只创建一个流。第一个open调用将创建这个流,而随后的open调用将返回引用这个流的文件描述符。打开相同次设备的每一个进程将共享该设备驱动程序的同
文档评论(0)