-
直接转换服务器源码至模块结构图的数据流图方法
资源介绍
18.5 服务器设计
现在我们开始描述一下服务器。有两个因素影响服务器的设计。
(1) 拨号过程可能会延续一段时间( 1 5 ~ 3 0秒),所以服务器一定要创建一个子进程来处理
实际的拨号。
(2) 服务器的精灵进程(父进程)一定要管理所有的加锁。
图1 8 - 2显示了这个过程。
图18-2 调制解调器拨号器的工作过程
服务器的工作过程如下:
(1) 父进程在服务器的众所周知名字处接收从客户机发来的请求。如 1 5 . 5节所述,这在客
户机-服务器之间生成了一个流管道。父进程就像 1 5 . 6节中的o p e n服务器一样,要同时处理多个
客户机。
(2) 基于客户机要联系的远程系统的名字,父进程查询S y s t e m s文件和D e v i c e s文件找到匹配的
项。父进程同时也维护一个加锁表,记录哪些设备在被使用,这样它就不查询那些被使用的项了。
(3) 如果发现匹配项,则 f r o k一个出子进程来进行实际的拨号。(父进程这时可以处理其他
客户机请求)。如果成功,子进程就在客户机指定的流管道上将调制解调器的文件描述符传给
客户机(这个管道在f o r k时也被复制了),并调用e x i t ( 0 )。如果发生了错误(例如,电话线占线、
没有响应等),子进程调用e x i t ( 1 )。
(4) 子进程结束时,会发送信号 S I G C H L D通知父进程。父进程就得到子进程的结束状态
(w a i t p i d)。
如果子进程成功,父进程就不用再做其他事情。在客户机结束使用调制解调器之前,必须
一直对调制解调器加锁。客户机指定的客户机 -父进程之间的流管道就一直打开着。这样,当
客户机终止时,父进程得到通知,然后释放对设备的加锁。
如果子进程不成功,父进程就从 S y s t e m s文件中尝试找下一个匹配项。如果找到了对远程
系统的另一项,父进程返回上一步,创建一个新的子进程来拨号。如果没有找到新的匹配项,
父进程调用s e n d _ e r r(见程序1 5 - 4)后关闭与客户机的流管道。
与每一个客户机有一个连接使子进程在必要时能将调试输出发回给客户机。发生问题时,
客户机常常想要看到整个实际拨号过程。
18.6 服务器源码
服务器包括1 7个源文件。表1 8 - 4详细说明了父进程和子进程所使用的文件,以及这些文件
第 1 8章 调制解调器拨号器 4 3 9
父进程 子进程
拨号命令
调制解调器服务器
客户机
请求
服务器
w / l o c k表Systems, Devices和
D i a l e r s文件
fork
e x i t状态