展望2011

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

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

17Postscrīpt打印机通信

1bA)vWO0

17.1引言

+@)c9Q[&j4e0

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

(M%Yf2ZOT$bEwK$P0

 

sa.M(_Mi2K0

17.2 Postscrīpt通信机制

Yr-K g yKoD0

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

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

 

3r)Y!ga}3E0_0

17.3假脱机打印

4B_)X]?Z+V0

    本章所开发的程序通过两种方式发送Postscrīpt程序给Postscrīpt打印机:单独的方式或者通过BSD行式打印机假脱机系统。通常使用假脱机系统,但提供一个独立的方式也很有用。

9N*Y&xGR{@&E0

    UNIX SVR4同样提供了一个假脱机打印系统。51Testing软件测试网O \4^P%Y[m ?

 51Testing软件测试网+p { \b9G8P

17.4源码51Testing软件测试网8JJ3`;gIVp

 51Testing软件测试网*G J#i3` GwH

 51Testing软件测试网G4H E B r*Z(`)\

18调制解调器拨号器51Testing软件测试网Y N(KW(o3P

18.1引言

,\H!r nA0aI$fP/a0

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

(o"n7@~N0

本章开发了一个程序来处理调制解调器所有需要处理的细节。51Testing软件测试网D1z*B"T6`z.Kt7}C

 

'Pwc0?'lR0

18.2历史51Testing软件测试网,_ ?Rh0x+n-wiB

 

_^:KZ Dc!s/^ta\0

18.3程序设计51Testing软件测试网?b6M W$ny

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

MbiBS5h3E&]P0

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

Mv.s B#I0

(2)一定要使用一些特定形式的锁,以保证当那些持有锁的程序在非正常结束时能自动释51Testing软件测试网$V9`(Y%K!K(ig0@

放它的锁。

P9Wt+T-X0

(3)新的程序一定要能够使用我们所开发的所有特性。51Testing软件测试网"}c2\Ye6?

(4)客户机程序,例如cutip,不应当需要特别权限。51Testing软件测试网pY,sQc Qr

18-1描述了客户机-服务器工作模式的结构。51Testing软件测试网#B+^ G.Hw,X

 51Testing软件测试网kl;dc;}KHm

18.4数据文件

x5px HC)}0

 

!DR#Fzb w0

18.5服务器设计

C4MI'K4P8b.V^u;pg0

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

2p`/GQZ} {0

   (1)拨号过程可能会延续一段时间(15~30秒),所以服务器一定要创建一个子进程来处理实际的拨号。51Testing软件测试网W/D-ZX&L:Pi[#f

   (2)服务器的精灵进程(父进程)一定要管理所有的加锁。

!xD4w~&w?0

    18-2显示了这个过程。

1T!w3w1h\/xl0

 51Testing软件测试网 @%E he{s+H7{6t

18.6服务器源码51Testing软件测试网4|l#c-{R

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

 

LW)Q r |0M B0k"v0

18.7客户机设计51Testing软件测试网\mJYrm[

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

18.7.1终端行规程

#O;R:[@"^2QW0

12-712-8给出了一个调制解调器拨号器的概况。图18-4则是图12-7的扩充。51Testing软件测试网wS,c wX0l |

18.7.2一个进程还是两个进程

)_e Xk1i3I+b,Z!X%qn[0

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

[w7]'Y1[ M]c0

我们基于以下两个原因采用一个进程:51Testing软件测试网9ykY.kv

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

zJ)QX;U0

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

B'nW_ Z0

 51Testing软件测试网r6gv1~7v2Yq bd

18.8客户机源码51Testing软件测试网-wI!x@:I0A+W

 

!vd.Py&F'~sv0

 51Testing软件测试网.FA8K |"G

19伪终端51Testing软件测试网#Ewg'y3k3w

19.1引言

2~6]/` Xr/@be$v B5o0

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

除了用于网络登录,伪终端还被用在其他方面,本章将对此进行介绍。51Testing软件测试网1F?(d[ GwjC

 

C|k)P{0

19.2概述51Testing软件测试网S:c@0|s

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

[n5HRrB,r0

   19-1显示了BSD系统中的伪终端结构。图19-2详细描述了SVR4系统中各个伪终端模块之间的关系。51Testing软件测试网F1Nf`2RGb;E4F

19.2.1网络登录服务器

$P)B7u\6]+ZE`#M!]0

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

K,fi"fa{iM+_0

本图的一个关键点是驱动伪终端主设备的进程通常同时在读写另一个I/O流。本例中另一个I/O流是TCP/IP

%G2gc B}1p8E(i0

19.2.2 scrīpt程序

#I/J2?0Nh4c~9rRL0

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

Q+^HY-? nF.z(C0

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

pLu6d^Gj:m6v0

19.2.3 expect程序

`3^O.P K,]i0

19.2.4运行协同程序

h Ex_#\-T0

19.2.5观看长时间运行程序的输出

6UL.v%MW;a0

 

tM'Ao5vr0

19.3打开伪终端设备

#oa"a3| H0

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

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

/f,OLR aT0

#include "ourhdr.h"51Testing软件测试网2}a#ax8Y-gra\2t

int ptym_open(char *pts_name);51Testing软件测试网R)xf8Z/xR(D.fH k

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

2UM!pO;Ev0

int ptys_open(int fdm, char *pts_name);51Testing软件测试网9n}5pu S nAP

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

M/Xwc3X fQ0

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

W3b!UuF"ESWFQ0

19.3.1 SVR451Testing软件测试网 d1_ a:Jqq ~t#X@

  伪终端主设备是/dev/ptmx。这是一个流的增殖设备(clone device)。这意味着当我们打开该增殖设备,其open例程自动决定第一个未被使用的伪终端主设备并打开这个设备。

9E!Z1y/|#n'rwx0

19.3.2 4.3+BSD51Testing软件测试网J0p;KC)Eh%CM

4.3+BSD系统中必须自己来确定第一个可用的伪终端主设备。为达到这个目的,从/dev/ptyp0开始并不断尝试,直到成功打开一个可用的伪终端主设备或试完所有设备。51Testing软件测试网_#UF%U9DO

 

:r S?!oqq0

19.4 pty_fork函数51Testing软件测试网CN2I Kk

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

5b9{5qO q'\6fcS#a0

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

%T"o+K!N AYS W0

#include <sys/types.h>51Testing软件测试网2@1D"zs8rO

#include <termios.h>

yr]t T \)hr4`0

#include <sys/ioctl.h>        /* 4.3+BSD defines struct winsize here */51Testing软件测试网U}.K'wG(S ~

#include "ourhdr.h"

/f0?;ok1x*E0

pid_t pty_fork(int *ptrfdm, char * slave_name,51Testing软件测试网j\9HVuk|"Z3q

              const struct termios *slave_termios,

\7R ?&^_U2tW0

         const struct winsize *slave_winsize);51Testing软件测试网_ [T{{Rt7e*qA

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

Q|-r;D[)u bj0

--------------------------------------------------------------------------------------------------------------------51Testing软件测试网SV b#?7` v Z m

 

{._j)Iz,Z%u0

19.5 pty程序51Testing软件测试网 f?^3@ts

   编写pty程序的目的是为了用键入:

7O+Mq:? o+JL-Lmst0

   pty prog arg1 arg2

]l(| t+z!CZ0

来代替:51Testing软件测试网EOd9|Kud0Q-dP

   prog arg1 arg2

K8Ne%Cs XX0

这样使我们可以用pty来执行另一个程序,该程序在一个自己的对话期中执行,并和一个伪终端连接。51Testing软件测试网F/wu5[}/q!vA

 51Testing软件测试网&r7?au;t5E5Z

19.6使用pty程序

gx)`;_'S"e{0

19.6.1 utmp文件51Testing软件测试网$b?#{R.i-j-DV

19.6.2作业控制交互

d!XNR*M6k$e_-U0

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

4ZodO+n5@S0

19.6.4 scrīpt程序51Testing软件测试网ux~gD'bs fi

19.6.5运行协同进程

?#ET$J+qEz8P0

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

G`&Fk/h!d]M0

 

+y$oeDi7K;`0

19.7其他特性

'ZV6ah?3zES0

19.7.1打包模式51Testing软件测试网o ZU|:T4IkV@

19.7.2远程模式51Testing软件测试网HimP IH

19.7.3窗口大小变化51Testing软件测试网*p;Z6N'_q$M0cYQ

19.7.4信号发生51Testing软件测试网(VD2E\.o@t


TAG:

 

评分:0

我来说两句

Open Toolbar