📄 00000017.htm
字号:
:af=/var/adm/psacct:lf=/var/adm/pslog:sd=/var/spool/pslpd:\ <BR> :if=/usr/local/lib/psif: <BR>图17.4 一个PostScript打印机对应的printcap项 <BR> 第一行给出了这个项的名称,ps或者lp。br的值指定了波特率是19200。lp指 <BR>定了该打印机的特殊设备文件路径名。sf是格式送纸,sh是指打印作业的开始加入 <BR>一个打印页头,rw是指定打印机以读写方式打开。如17.2节中所述,这一项是Pos <BR>tScript打印机所必须的。 <BR> 下面的四个域指定了在旧版本BSD风格的stty结构中需要打开和关闭的位。( <BR>我们在这里对此进行叙述是因为大多数使用printcap文件的BSD系统都支持这种老 <BR>式的设置终端方式的方法。在这一章的源程序文件中,我们可以看到如何使用第十 <BR>一章中所述的POSIX.1函数来设置所有的终端参数。)首先,fc掩码清除sg_flags <BR>元素中的下列值:EVENP和ODDP(关闭了奇偶校验)、RAW(关闭raw模式)、CRMO <BR>D(关闭了在输入输出中的CR/LF映射)、ECHO(关闭回显)和LCASE(关闭输入输 <BR>出中的大小写映射)。然后,fs掩码打开了以下位: CBREAK(一次输入一个字符 <BR>)和TANDEM(主机产生Control-S,Control-Q流控制)。接着,xc掩码清除了本地 <BR>模式字中各位。最后,xs掩码设置了本地模式字中的下列两位:LDECCTQ(Contro <BR>l-Q重新开始输出,Control-S则停止输出)和LLITOUT(压缩输出转换)。 <BR> af和lf字符串分别指定了记帐文件和日志文件。sd指定了假脱机的目录,而i <BR>f指定了输入过滤器。 <BR> 输入过滤器可被所有的打印文件所激活,格式如下: <BR>filter -n loginname -h hostname acctfile <BR> 这里还有几个可选的参数(这些参数有可能被PostScript打印机所忽略)。要 <BR>打印的文件在标准输入中,打印机(printcap文件中的lp项)设在标准输出。标准 <BR>输入也可以是一个管道。 <BR> 使用一个PostScript打印机,输入过滤器首先查询输入文件的开始两个字符, <BR>确定这个文件是一个ASCII文本文件还是一个PostScript程序。通常的惯例是前两 <BR>个字符为%!表示这是一个PostScript程序。如果这个文件是PostScript程序,lpr <BR>ps程序(在下面会详细讨论)就把它发送到打印机。如果这个文件是文本文件,就 <BR>使用其他程序将它转换成PostScript程序。 <BR> 在printcap文件中提到的psif过滤器是lprps软件包提供的。在这个包中的te <BR>xtps可以将文本文件转换成PostScript程序。图17.5概略表示了这些程序。 <BR>图17.5 lprps系统示意图 <BR> 图中有一个程序psrev没有表示出来,该程序将PostScript程序生成的页面反 <BR>转过来,当PostScript程序打印机在正面而不是在反面打印输出时,就可以使用此 <BR>程序。 <BR>概述以后,我们就来看一下lprps程序的设计和编码。 <BR>17.4 源程序 <BR> 我们先看main()调用的函数,以及它们是如何与打印机交互作用的。图17. <BR>6详细表明了这种相互作用。图中第二列标注为"int?",它指定该函数是否可以通 <BR>过接受SIGINT信号而中断。第三栏指定了各个函数的超时设置(以秒为单位)。注 <BR>意,当我们发送用户的PostScript程序到打印机时,没有超时设置。这是因为一个 <BR>PostScript程序可能用任意长的时间来执行。函数get_page行中的"我们的PostSc <BR>ript程序"是指程序17.9,这个程序是用来记录当前页码的。 <BR> 程序17.1列出了头文件lprps.h。该文件包含在所有的源文件中。该头文件包 <BR>含了各个源程序所需的系统头文件,定义了全局变量和全局函数的原型。 <BR>图17.6 被主程序调用的函数 <BR>_______________________________________________________________________ <BR>________ <BR>#include <sys/types.h> <BR>#include <sys/time.h> <BR>#include <errno.h> <BR>#include <signal.h> <BR>#include <syslog.h> /* since we're a daemon */ <BR>#include "ourhdr.h" <BR>#define EXIT_SUCCESS 0 /* defined by BSD spooling system */ <BR>#define EXIT_REPRINT 1 <BR>#define EXIT_THROW_AWAY 2 <BR>#define DEF_DEVICE "/dev/ttyb" /* defaults for debug mode */ <BR>#define DEF_BAUD B19200 <BR> /* modify following as a <BR>propriate */ <BR>#define MAILCMD "mail -s \"printer job\" %s@%s < %s" <BR>#define OBSIZE 1024 /* output buffer */ <BR>#define IBSIZE 1024 /* input buffer */ <BR>#define MBSIZE 1024 /* message buffer */ <BR> /* declare global variables */ <BR>extern char *loginname; <BR>extern char *hostname; <BR>extern char *acct_file; <BR>extern char eofc; /* PS end-of-file (004) */ <BR>extern int debug; /* true if interactive (not a daemon) */ <BR>extern int in_job; /* true if sending user's PS job to printer */ <BR>extern int psfd; /* file descriptor for PostScript printer */ <BR>extern int start_page;/* starting page# */ <BR>#include <syslog.h> /* since we're a daemon */ <BR>#include "ourhdr.h" <BR>#define EXIT_SUCCESS 0 /* defined by BSD spooling system */ <BR>#define EXIT_REPRINT 1 <BR>#define EXIT_THROW_AWAY 2 <BR>#define DEF_DEVICE "/dev/ttyb" /* defaults for debug mode */ <BR>#define DEF_BAUD B19200 <BR> /* modify following as a <BR>propriate */ <BR>#define MAILCMD "mail -s \"printer job\" %s@%s < %s" <BR>#define OBSIZE 1024 /* output buffer */ <BR>#define IBSIZE 1024 /* input buffer */ <BR>#define MBSIZE 1024 /* message buffer */ <BR> /* declare global variables */ <BR>extern char *loginname; <BR>extern char *hostname; <BR>extern char *acct_file; <BR>extern char eofc; /* PS end-of-file (004) */ <BR>extern int debug; /* true if interactive (not a daemon) */ <BR>extern int in_job; /* true if sending user's PS job to printer */ <BR>extern int psfd; /* file descriptor for PostScript printer */ <BR>extern int start_page;/* starting page# */ <BR>void msg_init(void); /* message.c */ <BR>void msg_char(int); <BR>void proc_msg(void); <BR>void out_char(int); /* output.c */ <BR>void get_page(int *); /* pagecount.c */ <BR>void send_file(void); /* sendfile.c */ <BR>void block_write(const char *, int); /* tty.c */ <BR>void tty_flush(void); <BR>void set_block(void); <BR>void set_nonblock(void); <BR>void tty_open(void); <BR>_______________________________________________________________________ <BR>________ <BR>程序17.1 lprps.h头文件 <BR>文件vars.c(程序17.2)定义了全局变量。 <BR>程序17.3是main函数。因为此程序一般是作为精灵进程运行的,所以main函数调用 <BR>log_open函数(见附录B)。我们不能将错误消息写到标准错误上-为此我们使用了 <BR>13.4.2小节中描述的syslog。 <BR>_______________________________________________________________________ <BR>________ <BR>#include "lprps.h" <BR>char *loginname; <BR>char *hostname; <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -