展望2011

《unix环境高级编程》通读学习笔记(七)(第17、18、19章)

上一篇 / 下一篇  2007-08-04 18:09:55 / 个人分类:unix环境高级编程的学习记录

17Postscrīpt打印机通信

0NR;N0Yy]3i^[Nf0

17.1引言51Testing软件测试网Dc}g{v

我们现在开发一个可以与Postscrīpt打印机通信的程序。同样,与Postscrīpt打印机通信是全双工的,在发送数据给打印机时也要准备好从打印机读取状态消息。

H;V%x*n@6E,\0a0

 51Testing软件测试网P#m(`Q,B1c

17.2 Postscrīpt通信机制

"RNzTBjv0

我们并不是发送一个文件给打印机去打印—而是发送一个Postscrīpt程序给打印机让它去执行。在Postscrīpt打印机中通常有一个Postscrīpt解释器来执行这个程序,生成输出的页面。如果Postscrīpt程序有错误,Postscrīpt打印机(实际上是Postscrīpt解释器)返回一个错误消息,或许还会产生其他输出。51Testing软件测试网7Fh)Si {S"NT

   Postscrīpt打印机通常通过RS-232串口与主机相连。这就如同终端的连接一样,所以第11章中的终端I/O函数在这里也适用。图17-1显示了典型的工作过程。51Testing软件测试网X9]'P7s p v4T

 51Testing软件测试网e cg1\-y8L,D

17.3假脱机打印

`+b(N9Y*m6G|I to0

    本章所开发的程序通过两种方式发送Postscrīpt程序给Postscrīpt打印机:单独的方式或者通过BSD行式打印机假脱机系统。通常使用假脱机系统,但提供一个独立的方式也很有用。51Testing软件测试网$P {1mq,r-u@3k;K

    UNIX SVR4同样提供了一个假脱机打印系统。

#tf2cY_iV,K L2A0

 

g,C:l%v"`t0

17.4源码

~'Uozzl.X%p0

 51Testing软件测试网Qq*LAjzlu(Y6G

 51Testing软件测试网d2^sOu!@*Jr

18调制解调器拨号器

~2z!thM"D0

18.1引言51Testing软件测试网FM%]a_/gJ1rN V

与调制解调器相关的程序要处理如此种类繁多的调制解调器很困难。在大多数UNIX系统中总有两个程序来处理调制解调器。第一个是远程登录程序,它允许我们拨通另外的计算机、登录和使用远程系统。在系统V中这个程序叫做cu,而BSD则称它为tip。另一个使用调制解调器的程序是uucico,它是UUCP包的一部分。51Testing软件测试网9E9| I8x+a.`6m

本章开发了一个程序来处理调制解调器所有需要处理的细节。51Testing软件测试网~ B W"A'?%y%bC.\

 

+sl:j$V%z#HA'\M0

18.2历史

,[]6gz}Uh;a0

 51Testing软件测试网3Q e?m a1Gs ]1q

18.3程序设计51Testing软件测试网kF0Q4]l ~

我们来分析一下调制解调器拨号器所应该具有的特性:

Ww&|0c/~*~/A/a X0

(1)它必须在不改动源码的情况下支持新增加的调制解调器类型。

+o XF!A _xFf0

(2)一定要使用一些特定形式的锁,以保证当那些持有锁的程序在非正常结束时能自动释

!h^$g&y'R|k!HG`7q0

放它的锁。

5mGz\`p0

(3)新的程序一定要能够使用我们所开发的所有特性。51Testing软件测试网f KtKfX

(4)客户机程序,例如cutip,不应当需要特别权限。

X ZA;c*e,M@-j0

18-1描述了客户机-服务器工作模式的结构。

-Y8f3u&k[!B1]F"Z+b0

 

4H&p/Ta-um2z0

18.4数据文件51Testing软件测试网[%G!\1t/K(G I3S

 51Testing软件测试网-y } YiP8Gw+R5xD[

18.5服务器设计51Testing软件测试网.d,eXK3x c*D0W

   现在我们开始描述一下服务器。有两个因素影响服务器的设计。

J"Qp7CM:M+b0

   (1)拨号过程可能会延续一段时间(15~30秒),所以服务器一定要创建一个子进程来处理实际的拨号。51Testing软件测试网XvUkB;T"l

   (2)服务器的精灵进程(父进程)一定要管理所有的加锁。51Testing软件测试网N+ep@+^ UQ:KG

    18-2显示了这个过程。

9ug)K0[!lXVDd"?0

 

2g[kA.qz^%wKP \0

18.6服务器源码51Testing软件测试网|xD{&S H$F

服务器精灵进程所做的其实就是打开一个终端设备和使用调解调器拨号。至于打开终端设备以后的工作取决于客户机。下面将看到一个提供了类似于cutip界面的客户机,它允许我们对远程系统拨号并登录。51Testing软件测试网D}p!H!ZhH

 51Testing软件测试网T"]j u [5k

18.7客户机设计

1[| He[^[hof,~,? ^0

   客户机与服务器之间的界面只是若干行代码。客户机生成一个命令行,发送到服务器,然后收到一个文件描述符或者一个错误消息。客户机的设计着重于客户机如何处理返回的文件描述符。这一节描述了一个类似于cutip程序的call客户机程序。这个程序允许我们对远程系统拨号,并登录。远程系统并不一定是一个UNIX系统。我们可以使用这个程序来同那些与本机通过RS-232串口连接的系统或设备进行通信。51Testing软件测试网uz]5of

18.7.1终端行规程

TmlTQ B0

12-712-8给出了一个调制解调器拨号器的概况。图18-4则是图12-7的扩充。51Testing软件测试网i t%s@|!\

18.7.2一个进程还是两个进程

Sf+}-iU']8_%Lk }0

  在图18-4中,我们看到的call程序只有一个进程。因为要读取两个描述符、写两个描述符,所以要求支持像select或者poll一样的I/O多路转接函数。我们同样也可以把客户机程序设计为如图12-8中的两个进程:一个父进程、一个子进程。图18-5就显示了这两个进程以及它们下方的行规程。

l` }8l6y4~3K0

我们基于以下两个原因采用一个进程:

9^ ks9s XO?+G0

(1)采用两个进程会使得客户机的终止变得复杂。

s"|m:tM2R^X0

(2)我们要在客户机实现一个文件传送函数,类似于cutip程序中的puttake命令。

"r[s`/k(bY0

 

O9?p0fH0

18.8客户机源码51Testing软件测试网J&mSJ$C AoZ

 

.Js)t4b4c;?(Ui+n0

 51Testing软件测试网!^k*qm ?\

19伪终端51Testing软件测试网n\ph!L)C Q

19.1引言51Testing软件测试网'yWu7P7dy8s7i

   9章介绍进行终端登录时,需要通过一个终端设备自动提供终端的语义。在终端和运行程序之间有一个终端行规程(见图11-2),通过这个规程我们能够在终端上设置特殊字符(退格、行删除、中断等)。但是,当一个登录请求到达网络连接时,终端行规程并不是自动被加载到网络连接和登录程序shell之间的。图9-5显示了一个伪终端设备驱动程序被用来提供终端语义。51Testing软件测试网*`"V7rq\}$iZL{

除了用于网络登录,伪终端还被用在其他方面,本章将对此进行介绍。

t#CF-P~$Twc7W:g7r0

 51Testing软件测试网d*mK6IW'C|

19.2概述51Testing软件测试网;H Tf Se1eY\K

伪终端(pseudo terminal)这个名词暗示了与一个应用程序相比,它更加像一个终端。但事实上,伪终端并不是一个真正的终端。图19-1显示了使用伪终端的进程的典型结构。

+v*w0Nky$e%{*o%@K0

   19-1显示了BSD系统中的伪终端结构。图19-2详细描述了SVR4系统中各个伪终端模块之间的关系。51Testing软件测试网b,_$y&_MV;Ep

19.2.1网络登录服务器51Testing软件测试网:OcjrA(_

伪终端用于构造网络登录服务器。典型的例子是telnetdrlogind服务器。一旦登录shell运行在远端主机上,即可得到如图19-3的结构。同样的结构也用于telnetd服务器。

t_'G:{L)U4l0

本图的一个关键点是驱动伪终端主设备的进程通常同时在读写另一个I/O流。本例中另一个I/O流是TCP/IP51Testing软件测试网/b#^ E7cC

19.2.2 scrīpt程序

4i;x,}&w} s7j/m~ X0

scrīpt程序是随SVR44.3+BSD提供的,该程序将终端对话期间所有的输入和输出信息在一个文件中做一个拷贝。它通过将自己置于终端和登录shell的一个新的调用之间来完成这个工作。图19-4详细描述了scrīpt程序相关的交互。51Testing软件测试网5Fy#hx&JvodF(UQ

scrīpt程序运行时,在伪终端从设备之上终端行规程的所有输出都被复制到一个scrīpt文件中(通常叫做typescrīpt)。

)ZQ?@V#`/TNRo0

19.2.3 expect程序51Testing软件测试网tvA+\6x8q3z

19.2.4运行协同程序

JjN G|8w0

19.2.5观看长时间运行程序的输出51Testing软件测试网;l(Gm7W6b

 

X?|$hsWw?8uNG0

19.3打开伪终端设备51Testing软件测试网0jvQ5fE8m&iQ

SVR44.3+BSD系统中打开伪终端设备的方法有所不同。我们提供两个函数来处理所有细节:ptym_open用来打开下一个有效的伪终端主设备,ptys_open用来打开相应的从设备。51Testing软件测试网,LZ |(e1S

---------------------------------------------------------------------------------------------------------------------51Testing软件测试网9w8^] _%m i3\Eg/S

#include "ourhdr.h"

J F)XX0j;{&F^o0

int ptym_open(char *pts_name);51Testing软件测试网8WH Bb*k8]

                         返回:若成功则为伪终端主设备文件描述符,否则为-151Testing软件测试网N,R#|ncv

int ptys_open(int fdm, char *pts_name);

]Ul7c_,[v|ug@0

                      返回:若成功则为伪终端从设备文件描述符,否则为-1

_t l[5E;H0

---------------------------------------------------------------------------------------------------------------------

1?i5\ ~+R0

19.3.1 SVR451Testing软件测试网.^0Q]5Ff;vm6a8V

  伪终端主设备是/dev/ptmx。这是一个流的增殖设备(clone device)。这意味着当我们打开该增殖设备,其open例程自动决定第一个未被使用的伪终端主设备并打开这个设备。51Testing软件测试网3O\%sC:A8H

19.3.2 4.3+BSD

%Ha _,O6yt{j6E0

4.3+BSD系统中必须自己来确定第一个可用的伪终端主设备。为达到这个目的,从/dev/ptyp0开始并不断尝试,直到成功打开一个可用的伪终端主设备或试完所有设备。51Testing软件测试网4`5F,j8z0|7Z I s

 

2\Vp8c+O)O1? @1P0

19.4 pty_fork函数

.lg)z*lm:L s9uC0

现在使用上一节介绍的两个函数:ptym_openptys_open,编写我们称之为pty_fork的函数。这个新函数具有如下功能:打开主设备和从设备,建立作为对话期管理者的子进程并使其具有控制终端。

$H9I_2LU+a0

---------------------------------------------------------------------------------------------------------------------51Testing软件测试网D{T0B_O

#include <sys/types.h>51Testing软件测试网U J&G4S Z$]

#include <termios.h>

)UXHO#B8]0

#include <sys/ioctl.h>        /* 4.3+BSD defines struct winsize here */

^:{f/c4`J0

#include "ourhdr.h"

4}j|\[(`vh7\0

pid_t pty_fork(int *ptrfdm, char * slave_name,

(N!W'fgq]i,y0

              const struct termios *slave_termios,51Testing软件测试网+i0w2Z1]*yq8b

         const struct winsize *slave_winsize);

#eb? _3?+E0

            返回:子进程中为0,父进程中为子进程的进程ID,若错误则为-1

R&h(R3^:[Rc:h@4E0

--------------------------------------------------------------------------------------------------------------------

)A(n,[+~/@ pvv gQ0

 51Testing软件测试网I M.f|kn

19.5 pty程序

A*M9z)gV8i0

   编写pty程序的目的是为了用键入:51Testing软件测试网+^`c f5Z[

   pty prog arg1 arg2

-I^O`;[0

来代替:

DGmK5CJa0

   prog arg1 arg2

y$r AgG!H0

这样使我们可以用pty来执行另一个程序,该程序在一个自己的对话期中执行,并和一个伪终端连接。

"r;\3FR:k%D,QE0

 

r%Uwwgu0

19.6使用pty程序51Testing软件测试网1e N-q:g$bT8A4C

19.6.1 utmp文件

.y^m_ Q#f5WGH0

19.6.2作业控制交互51Testing软件测试网SI%p2s6W

19.6.3检查长时间运行程序的输出

_ntc/S1vLS0

19.6.4 scrīpt程序

K%b FYL\*ws0

19.6.5运行协同进程51Testing软件测试网-h}0feXhO

19.6.6用交互模式驱动交互式程序

y"l,q.t3w |bw/|7v'P0

 

e#Dt$B |\f} O0

19.7其他特性51Testing软件测试网d)TcH@)~!K;o

19.7.1打包模式

{tE3bI/vlT0

19.7.2远程模式51Testing软件测试网-xM%gM1~

19.7.3窗口大小变化51Testing软件测试网k9NH/jv$X%a#U

19.7.4信号发生51Testing软件测试网:^9n V6z BC


TAG:

 

评分:0

我来说两句

Open Toolbar