⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000018.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;SuperSB&nbsp;(孤鹰),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;[转载]unix环境高级编程-18&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Wed&nbsp;Mar&nbsp;15&nbsp;14:31:58&nbsp;2000)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>发信人:&nbsp;taosm&nbsp;(128+64--&gt;cool),&nbsp;信区:&nbsp;unix&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;unix环境高级编程--第18章&nbsp;调制解调器拨号器&nbsp;&nbsp;<BR>发信站:&nbsp;西十八BBS&nbsp;(Sat&nbsp;Mar&nbsp;11&nbsp;14:20:54&nbsp;2000),&nbsp;转信&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>第十八章&nbsp;调制解调器拨号器&nbsp;&nbsp;<BR>18.1&nbsp;引言&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;与调制解调器(modem)相关的程序要处理如此种类繁多的调制解调器是很困&nbsp;&nbsp;<BR>难的。在大多数Unix系统中总有两个程序来处理调制解调器。第一个是远程登录程&nbsp;&nbsp;<BR>序,它允许我们拨通另外的计算机、登录和使用远程系统。在系统V中这个程序叫&nbsp;&nbsp;<BR>做cu,而BSD则称它为tip。它们完成类似的工作,而且都可以处理很多不同类型的&nbsp;&nbsp;<BR>调制解调器。另一个使用调制解调器的程序是uucico,它是UUCP包的一部分。问题&nbsp;&nbsp;<BR>是不同种类调制解调器的具体特性一般都包含在这些程序的内部,于是如果想写其&nbsp;&nbsp;<BR>他使用调制解调器的程序,我们就不得不做这些程序类似的工作。同样,如果我们&nbsp;&nbsp;<BR>想要改变这些程序,使其不通过调制解调器,而利用其它介质通信(例如网络连接&nbsp;&nbsp;<BR>),那么也要做很大的改动。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;在这一章中,我们开发了一个程序来处理调制解调器所有需要处理的细节。我&nbsp;&nbsp;<BR>们把所有这些的细节都集中到这一个程序中,而不是分散在多个程序里。(这个程&nbsp;&nbsp;<BR>序的构思来自于Presotto&nbsp;和Ritchie&nbsp;[1990]所描述的连接服务器)。为了使用这&nbsp;&nbsp;<BR>一个程序,我们必须能如15.3节所说明的那样调用它,并使它传回文件描述符。然&nbsp;&nbsp;<BR>后,我们用这个程序来开发远程登录程序(类似cu和tip&nbsp;)。&nbsp;&nbsp;<BR>18.2&nbsp;历史&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;cu(1)&nbsp;命令(意思是call&nbsp;unix)是在Version&nbsp;7中出现的。但它只能处理一种&nbsp;&nbsp;<BR>特殊的自动拨号单元(ACU)。伯克利的Bill&nbsp;Shannon修改了cu,并把它实现在4.&nbsp;&nbsp;<BR>2BSD的tip(1)中。这之间的最大改变是使用了一个文本文件/etc/remote来存放所&nbsp;&nbsp;<BR>有的系统信息(电话号码、优先的拨号器、波特率、奇偶校验、流控制等)。这个&nbsp;&nbsp;<BR>版本的tip支持六种不同的拨号单元和调制解调器,但要支持其他种类的调制解调&nbsp;&nbsp;<BR>器则要修改源码。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;与cu和tip一样,UUCP系统也可以使用调制解调器和自动拨号单元。UUCP对不&nbsp;&nbsp;<BR>同的调制解调器进行加锁,因此多个UUCP的实例可以同时运行。这样,tip和cu程&nbsp;&nbsp;<BR>序就不得不遵循UUCP协议,避免与UUCP冲突。在BSD系统中,UUCP使用了它自己的&nbsp;&nbsp;<BR>拨号函数。这些函数被连接到UUCP的可执行程序中,这样增加新的调制解调器也需&nbsp;&nbsp;<BR>要修改源码。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;SVR2提供了一个dial(3)函数来将调制解调器拨号的一致特性归纳到一个库函&nbsp;&nbsp;<BR>数中。这个函数由cu使用,但UUCP不使用。这是一个标准的C库函数,所以可以被&nbsp;&nbsp;<BR>一般程序使用。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Honey&nbsp;DanBer&nbsp;UUCP系统,是将调制解调器命令从C源程序中抽取出来,将它们&nbsp;&nbsp;<BR>放在一个Dialers文件中。这就允许不修改源码就加入新类型的调制解调器。但是&nbsp;&nbsp;<BR>cu和uucp所使用的访问Dialers文件的函数不是很通用。这说明cu和UUCP可以不重&nbsp;&nbsp;<BR>新开发代码去处理Dialers文件中的拨号信息,但除了cu和UUCP以外的程序并不能&nbsp;&nbsp;<BR>使用这个文件。&nbsp;&nbsp;<BR>在所有的这些版本的cu、tip和UUCP中,加锁保证了在同一时间只有一个程序使用&nbsp;&nbsp;<BR>某一设备。因为这些程序工作在不同系统中,早期的版本不提供记录锁,而使用一&nbsp;&nbsp;<BR>个早期形式的文件加锁。这会导致当一个程序崩溃时,该锁文件仍旧保留,所以又&nbsp;&nbsp;<BR>开发特殊的技术来处理这种情况。(对特殊设备文件不能使用记录锁,所以记录锁&nbsp;&nbsp;<BR>也不能完全解决问题)。&nbsp;&nbsp;<BR>18.3&nbsp;&nbsp;程序设计&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;我们来分析一下调制解调器拨号器(dialer)所应该具有的特性。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;1.它必须在不改动源码的情况下支持新增加的调制解调器类型。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;为了达到这个目标,我们使用了Honey&nbsp;DanBer的Dialers文件。我们将所有使&nbsp;&nbsp;<BR>用这个文件来拨号调制解调器的代码都放到一个精灵服务进程中,这样任何程序都&nbsp;&nbsp;<BR>可以使用15.5节中的客户机-服务器函数来访问它。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;2.一定要使用一些特定形式的锁,以保证当那些持有锁的程序在非正常结束&nbsp;&nbsp;<BR>时能自动释放它的锁。以前那些专门的技术,如那些在大多数cu和UUCP版本中仍然&nbsp;&nbsp;<BR>使用的技术,都不应再使用。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;我们用一个服务器精灵进程来处理所有设备加锁。因为在15.5节中的客户机-&nbsp;&nbsp;<BR>服务器函数会在客户机终止时自动通知服务器,所以这个精灵进程能释放进程所持&nbsp;&nbsp;<BR>有的任何加锁。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;3.新的程序一定要能够使用我们所开发的所有特性。开发一个新的处理调制&nbsp;&nbsp;<BR>解调器的程序不应当什么都要自己实现,它拨任何类型的调制解调器应该就象函数&nbsp;&nbsp;<BR>调用一样简单方便。为此,我们让中央服务器精灵进程处理所有与拨号有关的操作&nbsp;&nbsp;<BR>,并返回一个文件描述符。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;4.客户机程序,例如cu和tip,不应当需要特别权限。这些程序不应当是设置&nbsp;&nbsp;<BR>用户ID(set_user_ID)程序。但是我们要给予服务器精灵进程特殊权限,允许客&nbsp;&nbsp;<BR>户机程序运行时无需特权。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;显然我们不能改动已有的cu、tip和UUCP程序,但应该让其它程序在我们工作&nbsp;&nbsp;<BR>的基础上实现起来更加简单。当然,我们也一定要充分吸取已有的Unix&nbsp;拨号程序&nbsp;&nbsp;<BR>的优点。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;图18.&nbsp;1描述了客户机-服务器工作模式的结构。&nbsp;&nbsp;<BR>图18.&nbsp;1&nbsp;&nbsp;客户机-服务器工作模式的示意图&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;建立与远程系统的通信过程如下:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;0.启动服务器端进程&nbsp;&nbsp;<BR>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;客户端程序启动,使用cli_conn函数(15.5节)建立与服务器端程序的连接。&nbsp;&nbsp;<BR>客户端程序向服务端发出一个请求,请求拨号远程系统。&nbsp;&nbsp;<BR>2.&nbsp;服务端程序读取Systems、Devices和Dilaers配置文件来决定如何拨号远程系&nbsp;&nbsp;<BR>统(我们在下一部分讲述这些文件)。如果正使用一个调制解调器,在对应的Dia&nbsp;&nbsp;<BR>lers配置文件中就包含了这个特定调制解调器的所有命令。&nbsp;&nbsp;<BR>3.&nbsp;服务端程序打开该调制解调器设备并拨号该调制解调器。这需要一些时间(一&nbsp;&nbsp;<BR>般15-30秒)。服务端程序处理所有对该调制解调器的加锁,以避免各用户间的冲&nbsp;&nbsp;<BR>突。&nbsp;&nbsp;<BR>4.&nbsp;如果拨号成功,服务端程序返回一个该调制解调器设备的文件描述符给客户端&nbsp;&nbsp;<BR>。在15.3节中的函数可以发送和接受这个描述符。&nbsp;&nbsp;<BR>5.&nbsp;客户端直接与远程系统通信。服务器端不再参与这个过程。客户端读写上一步&nbsp;&nbsp;<BR>返回的文件描述符就可以了。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;客户端与服务端的通信过程(步骤1-4)是通过一个流管道进行的。当客户端&nbsp;&nbsp;<BR>完成与远程系统的通信时,客户端关闭该流管道。服务端发现该管道关闭,释放对&nbsp;&nbsp;<BR>调制解调器设备的加锁。&nbsp;&nbsp;<BR>18.4&nbsp;&nbsp;&nbsp;数据文件&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;在这一部分,我们描述Honey&nbsp;DanBer&nbsp;UUCP系统所使用的三个文件:Systems、&nbsp;&nbsp;<BR>&nbsp;Devices和Dialers。在这些文件中有很多UUCP所使用的域。我们这里不详细讲述&nbsp;&nbsp;<BR>这些域和UUCP系统本身。参考Redman&nbsp;[1989]可得到更详细的信息。&nbsp;&nbsp;<BR>18.2&nbsp;&nbsp;分栏列出了在Systems&nbsp;文件中的六个域。&nbsp;&nbsp;<BR>&nbsp;name&nbsp;&nbsp;&nbsp;time&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;&nbsp;&nbsp;phone&nbsp;&nbsp;&nbsp;&nbsp;login&nbsp;&nbsp;<BR>&nbsp;host1&nbsp;&nbsp;<BR>&nbsp;host1&nbsp;&nbsp;<BR>&nbsp;host1&nbsp;&nbsp;<BR>&nbsp;modem&nbsp;&nbsp;<BR>&nbsp;laser&nbsp;&nbsp;Any&nbsp;&nbsp;<BR>Any&nbsp;&nbsp;<BR>Any&nbsp;&nbsp;<BR>Any&nbsp;&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -