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

📄 00000017.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环境高级编程-17&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Wed&nbsp;Mar&nbsp;15&nbsp;14:31:48&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环境高级编程--第17章&nbsp;与PostScript打印机&nbsp;&nbsp;<BR>发信站:&nbsp;西十八BBS&nbsp;(Sat&nbsp;Mar&nbsp;11&nbsp;14:13:45&nbsp;2000),&nbsp;转信&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>第十七章&nbsp;&nbsp;与PostScript打印机通信&nbsp;&nbsp;<BR>17.1&nbsp;引言&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;我们现在开发一个可以与Postscript打印机通信的程序。PostScript打印机目&nbsp;&nbsp;<BR>前使用很广,它一般通过RS-232端口与主机相连。这样就使得我们有可能使用第十&nbsp;&nbsp;<BR>一章中的终端I/O函数。同样,与PostScript打印机通信是全双工的,我们发送数&nbsp;&nbsp;<BR>据给打印机时也要准备好从打印机读取状态消息。这样,我们又有可能使用12.5节&nbsp;&nbsp;<BR>中的I/O多路转接函数:select&nbsp;和poll。我们所开发的这个程序是基于James&nbsp;Cla&nbsp;&nbsp;<BR>rk&nbsp;所写的lprps程序。这个程序和其他一些程序共同组成lprps软件包,可以在co&nbsp;&nbsp;<BR>mp.sources.misc新闻组中找到(Volume&nbsp;21,1991年7月)。&nbsp;&nbsp;<BR>17.2&nbsp;&nbsp;PostScript&nbsp;通信机制&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;关于PostScript打印机所需要知道的第一件事就是我们并不是发送一个文件给&nbsp;&nbsp;<BR>打印机去打印-我们只是发送一个PostScript程序给打印机让它去执行。在PostSc&nbsp;&nbsp;<BR>ript打印机中通常有一个PostScript解释器来执行这个程序,生成输出的页面。如&nbsp;&nbsp;<BR>果PostScript程序有错误,PostScript打印机(实际上是PostScript解释器)返回&nbsp;&nbsp;<BR>一个错误消息,或许还会产生其他输出。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;下面的PostScript程序在输出页面上生成一个熟悉的字符串hello,&nbsp;world。(&nbsp;&nbsp;<BR>我们这里并不叙述PostScript编程,详细情况请参见Adobe&nbsp;Systems[1985和1986]&nbsp;&nbsp;<BR>。我们着重在与PostScript打印机的通信上)。&nbsp;&nbsp;<BR>%!&nbsp;&nbsp;<BR>/Times-Roman&nbsp;findfont&nbsp;&nbsp;<BR>15&nbsp;scalefont&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;point&nbsp;size&nbsp;of&nbsp;15&nbsp;&nbsp;<BR>setfont&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;establish&nbsp;current&nbsp;font&nbsp;&nbsp;<BR>300&nbsp;350&nbsp;moveto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;x=300&nbsp;y=350&nbsp;(position&nbsp;on&nbsp;page)&nbsp;&nbsp;<BR>(hello,&nbsp;world)&nbsp;show&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;output&nbsp;the&nbsp;string&nbsp;to&nbsp;current&nbsp;page&nbsp;&nbsp;<BR>showpage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;and&nbsp;output&nbsp;page&nbsp;to&nbsp;output&nbsp;device&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;如果我们在PostScript程序中改变setfont&nbsp;为ssetfont,再把它发送到PostS&nbsp;&nbsp;<BR>cript打印机,结果是什么也没有被打印。相反的,我们从打印机得到以下消息:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>%%&nbsp;[&nbsp;Error:&nbsp;undefined;&nbsp;OffendingCommand:&nbsp;ssetfont&nbsp;]%%&nbsp;&nbsp;<BR>%%&nbsp;[&nbsp;Flushing:&nbsp;rest&nbsp;of&nbsp;job&nbsp;(to&nbsp;end-of-file)&nbsp;will&nbsp;be&nbsp;ignored&nbsp;]%%&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;这些错误消息随时都可能产生,这也是处理PostScript打印机复杂的地方。我&nbsp;&nbsp;<BR>们不能只是将整个PostScript程序发送给打印机后就不管了-我们必须处理这些潜&nbsp;&nbsp;<BR>在的错误消息。(在这一章中,我们所说的&quot;打印机&quot;,就是指PostScript解释器。&nbsp;&nbsp;<BR>)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;PostScript打印机通常通过RS-232串口与主机相连。这就如同终端的连接一样&nbsp;&nbsp;<BR>,所以我们在第十一章中的终端I/O函数在这里也适用。(PostScript打印机也可&nbsp;&nbsp;<BR>以通过其它方式连接到主机上,例如网络接口逐渐流行。但目前占主导地位的还是&nbsp;&nbsp;<BR>串口相连。)图17.2&nbsp;显示了典型的工作过程。一个PostScript程序可以产生两种&nbsp;&nbsp;<BR>形式的输出:通过showpage操作输出到打印机页面上,或者通过print操作输出到&nbsp;&nbsp;<BR>它的标准输出(在这里是与主机的串口连接)。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;PostScript解释器发送和接受的是七位ASCII字符。PostScript程序可包含所&nbsp;&nbsp;<BR>有可打印的ASCII字符。一些不可以打印的字符有着特殊的含义(参见图17.1)。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>图17.1&nbsp;从主机发送到PostScript打印机的特殊字符&nbsp;&nbsp;<BR>图17.2&nbsp;&nbsp;用串口连接与Postscript打印机通信&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;PostScript的文件终止符(Control-D)用来同步打印机和主机。我们发送一&nbsp;&nbsp;<BR>个PostScript程序到打印机,然后再发送一个EOF到打印机。当打印机执行完Post&nbsp;&nbsp;<BR>Script程序后,它就发回一个EOF。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;当PostScript解释器正在执行一个PostScript程序时,我们可以向它发送一个&nbsp;&nbsp;<BR>中断(Control-C)。这通常使正在被打印机执行的程序终止。&nbsp;&nbsp;<BR>状态查询消息(Control-T)会使得打印机返回一个一行的状态消息。所有的打印&nbsp;&nbsp;<BR>机消息都是如下格式:&nbsp;&nbsp;<BR>%%&nbsp;[&nbsp;key&nbsp;:&nbsp;val&nbsp;]&nbsp;%%&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;所有可能出现在状态消息中的key:&nbsp;val对,被分号分开。回忆前面例子的返回&nbsp;&nbsp;<BR>消息:&nbsp;&nbsp;<BR>%%&nbsp;[&nbsp;Error:&nbsp;undefined;&nbsp;OffendingCommand:&nbsp;ssetfont&nbsp;]%%&nbsp;&nbsp;<BR>%%&nbsp;[&nbsp;Flushing:&nbsp;rest&nbsp;of&nbsp;job&nbsp;(to&nbsp;end-of-file)&nbsp;will&nbsp;be&nbsp;ignored&nbsp;]%%&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;这个状态消息具有这个格式:&nbsp;&nbsp;<BR>%%&nbsp;[status&nbsp;:&nbsp;idle&nbsp;]%%&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;除了idle(没有作业)外,其它状态指示还有busy(正在执行一个PostScrip&nbsp;&nbsp;<BR>t程序)、&nbsp;waiting(正在等待执行PostScript程序)、&nbsp;printing(打印中)、i&nbsp;&nbsp;<BR>nitializing(初始化)和printing&nbsp;test&nbsp;page(正打印测试页)。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;现在来考虑PostScript解释器自己产生的状态消息。我们看到以下的消息&nbsp;&nbsp;<BR>%%&nbsp;[&nbsp;Error:&nbsp;error&nbsp;;&nbsp;OffendingCommand&nbsp;:&nbsp;operator&nbsp;]%%&nbsp;&nbsp;<BR>总共大约会发生25种不同的错误。通常的错误有dictstackunderflow,&nbsp;invalidac&nbsp;&nbsp;<BR>cess,&nbsp;typecheck,&nbsp;和undefined。这里的operator是产生错误的PostScript操作。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;一个打印机的错误用以下形式来指示。&nbsp;&nbsp;<BR>%%&nbsp;[&nbsp;PrinterError:&nbsp;reason&nbsp;]%%&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;这儿的reason一般是Out&nbsp;Of&nbsp;Paper(缺纸)、Cover&nbsp;Open(盖打开)等错误。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>当错误发生时,PostScript解释器经常会发出另外一个消息&nbsp;&nbsp;<BR>%%&nbsp;[&nbsp;Flushing&nbsp;:&nbsp;rest&nbsp;of&nbsp;job&nbsp;(to&nbsp;end-of-file)&nbsp;will&nbsp;be&nbsp;ignored&nbsp;]&nbsp;%%&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;我们看一下在特殊字符序列%%[和]%%中的字符串,为了处理这个消息,我们必&nbsp;&nbsp;<BR>须分析该字符串。一个PostScript程序也可以通过PostScript的print操作来产生&nbsp;&nbsp;<BR>输出。这个输出应当传给发送程序给打印机的用户(虽然这并不是我们的打印程序&nbsp;&nbsp;<BR>所期望解释的)。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;图17.3&nbsp;&nbsp;列出了PostScript解释器传送给主机的特殊字符。&nbsp;&nbsp;<BR>图17.3&nbsp;&nbsp;PostScript解释器传送给主机的特殊字符&nbsp;&nbsp;<BR>17.3&nbsp;&nbsp;假脱机打印&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;我们在本章所开发的程序通过两种方式发送PostScript程序给PostScript打印&nbsp;&nbsp;<BR>机,单独的方式或者通过BSD行式打印机假脱机系统。通常使用假脱机系统,但提&nbsp;&nbsp;<BR>供一个独立的方式也是很有用的,如用于测试等。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Unix&nbsp;SVR4同样提供了一个假脱机打印系统,在AT&amp;T手册[1991]&nbsp;第一部分以l&nbsp;&nbsp;<BR>p开头的手册页中可以找到假脱机系统的详细资料。Stevens[1990]的第13章详细说&nbsp;&nbsp;<BR>明了BSD和pre-SVR4的假脱机系统。我们在这一章中并不着重在假脱机系统上,而&nbsp;&nbsp;<BR>在于与PostScript打印机的通信。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;在BSD的假脱机系统中,我们以如下形式打印一个文件&nbsp;&nbsp;<BR>lpr&nbsp;-pps&nbsp;main.c&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;这个命令发送文件main.c到名为ps的打印机。如果我们没有指定-pps的选项,&nbsp;&nbsp;<BR>那么或者输出到PRINTER环境变量对应的打印机上,或者输出到缺省的lp打印机上&nbsp;&nbsp;<BR>。所用的打印机参数可以在/etc/printcap文件中查到。图17.4是对应一个PostSc&nbsp;&nbsp;<BR>ript打印机的一项。&nbsp;&nbsp;<BR>&nbsp;lp|ps:\&nbsp;&nbsp;<BR>&nbsp;&nbsp;:br#19200:lp=/dev/ttyb:\&nbsp;&nbsp;<BR>&nbsp;&nbsp;:sf:sh:rw:\&nbsp;&nbsp;<BR>&nbsp;&nbsp;:fc#0000374:fs#0000003:xc#0:xs#0040040:\&nbsp;&nbsp;<BR>

⌨️ 快捷键说明

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