打印机冒号文件和 piobe 命令

piobe 命令是一个被 qdaemon 程序调用的假脱机后端程序,它用于处理打印作业。

piobe 命令可以生成诊断输出。 下面的讨论会使用此诊断输出的一个特定示例来检查以下几点:

  • piobe 如何使用打印机冒号文件。
  • 如何对打印机冒号文件转义序列求值来解析路径名。
  • 如何对打印机冒号文件转义序列求值来解析页面长度。
  • 如何对打印机冒号文件转义序列求值来解析页面宽度。

这里的讨论是想帮助需要在较低层次上理解打印机冒号文件转义序列的读者,因为他们也许想为唯一和不支持的打印机编写自己的冒号文件。 在阅读此讨论之前,您应该熟悉这些主题:

以下命令使用 -a1 标志/参数从 piobe 后端请求诊断数据。 命令的剩余部分指定作业由名为 asc 的队列处理,名为 /etc/motd 的文件的三个副本以旋转 90 度的 12 点 Courier 字体打印, 作业由 pr 过滤器进行预处理,作业生成的任何消息都应该邮寄给提交作业的用户。

qprt -a1 -Pasc -fp -z1 -p12 -scourier -C -N3 /etc/motd

发出此命令会导致将类似于以下的邮件发送给发出命令的用户:

Message from qdaemon:
=====> MESSAGE FROM PRINT JOB 31 (/etc/motd) <=====
0782-034 Below is the preview information requested with the -a1
flag.
         No files will be printed.
PRINTER:
[devices.cat,71,66;IBM 4029 LaserPrinter] (ASCII)
FLAG VALUES:
a=1, b=0, d=a, e=!, f=p, g=1, h=, i=0, j=1, l=48, p=12, q=, s=cou
rier, t=0,
u=1, v=6, w=128, x=2, y=!, z=1, A=1, B=nn, C=+, E=!, G=!, H=, I=,
 J=+, L=+,
N=3, O=3, P=ascx:lxx, Q=1, W=!, X=ISO8859-1, Z=+
PIPELINE OF FILTERS:
/usr/bin/pr
   -l48
   -w128  /etc/motd |
/usr/lib/lpd/pio/etc/pioformat
   -@/var/spool/lpd/pio/@local/ddi/ibm4029.asc.lp1.asc:lp1
   -!/usr/lib/lpd/pio/fmtrs/piof5202
   -l48
   -w128
   -p12
   -scourier
   -z1

邮件指定多个项:

  • 将要使用的物理打印机。
  • 属于此假脱机程序队列的标志值。
  • 将被执行的过滤器管道。

命令行使用的标志值 a1Pascfpz1p12scourierC N3 可以在邮件中标注为“标志值”的部分看到。

更值得关注的是邮件中标注为“过滤器管道”的部分。 此处可以看到由 piobe 确定并由 shell 构造的过滤器的管道。 pr 过滤器将预处理打印作业(/etc/motd),并将它的输出发送到设备无关的格式化程序驱动程序 pioformat

此处是检查 piobe 如何使用与名为 asc 的假脱机程序队列关联的虚拟打印机定义的合适位置。 冒号文件(包含此队列的虚拟打印机定义)使用属性 ia 来指定 ASCII 作业的输入数据流管道(上述“过滤器管道”部分)。 此队列的 ia 值为:

%Ide/pioformat -@%Idd/%Imm -!%Idf/piof5202 -l%IwL -w%IwW
%f[begijpqstuvxyzEGIJLOQWXZ] %Uh

lsvirprt 命令可用来格式化 ia,因此它的内容如下:

%Id         INCLUDE: (Directory Containing Miscellaneous Modules)
'/pioformat -@'
%Idd       INCLUDE: (Directory Containing Digested Data Base
Files)
'/'
%Imm     INCLUDE: (File Name Of (Digested) Data Base; Init. By
               "piodigest" (mt.md.mn.mq:mv))
' -!'
%Idf         INCLUDE: (Directory Containing Loadable Formatter
Routines)
'/piof5202 -l'
%IwL       INCLUDE: (Page Length In Chars, Using Length From Data
Base
               (used in pipelines))
' -w'
%IwW     INCLUDE: (Page Width In Characters, Using Width From
Data Base
               (used in pipelines))
' '
%f[begijpqstuvxyzEGIJLOQWXZ] For Each Flag x on Command
Line:"-xArgument" ->
                          OUTPUT
' '
%Uh    Indicate to piobe: Pass the Following Attributes to
subsequent
       printer commands

%Id 解析为 /usr/lib/lpd/pio/etc,即包含其他模块的目录。 '/pioformat -@' 将在没有单引号的情况下追加到前一个字符串中,变为 /usr/lib/lpd/pio/etc/pioformat,否则称为格式化程序驱动程序的完整路径名。 pioformat 之后的 -@pioformat 命令的标志,此命令在此实例中指定要访问的摘要数据库文件的完整路径名。

-@ 标志的值由 %Idd'/'%Imm 并置指定。 %Idd 的值 在冒号文件中定义为 %I@5/ddi@5 是一个自动变量,其值为 /var/spool/lpd/pio/@local,因此 %Idd 解析为 /var/spool/lpd/pio/@local/ddi。 没有单引号的 ' /'将追加到该路径中。 %Imm 在冒号文件中定义为 mt.md.mn.mq.mv和其他虚拟打印机属性。 这些属性定义:

  • mt - 打印机类型
  • md - 输出数据流类型
  • mn - 设备名
  • mq - 队列名(/etc/qconfig 中队列节的名称)
  • mv -虚拟打印机名称 ( /etc/qconfig中相应设备节的名称)

这些文件虚拟打印机属性在创建队列和虚拟打印机时由 piodigest 命令初始化。 五项的组合在虚拟打印机数据库中是唯一的。

对于此队列,mt.md.mn.mq.mv 的值为 ibm4029.asc.lp1.asc.lp1。 因此, pioformat-@ 标志的值变为 /var/spool/lpd/pio/@local/ddi/ibm4029.asc.lp1.asc.lp1,这是定义与此队列相关联的虚拟打印机 (asc) 的摘要数据库文件的完整路径。

"-!"pioformat的第二个标志,用于指定要在运行时由格式化程序驱动程序 pioformat装入,链接和驱动的依赖于设备的格式化程序的完整路径名。 此处您可以看到这两个模块之间的运行时连接如何发生以及在何处发生。

-! 标志的值由显示在 ia 属性格式化形式中、以 %Idf'/piof5202 -l' 开头的打印机冒号文件转义序列的剩余部分的并置指定。

%Idf 的值在冒号文件中定义为 %I@4/fmtrs@4 是一个自动变量,其值为 /usr/lib/lpd/pio,因此 %Idf 解析为 /usr/lib/lpd/pio/fmtrs'piof5202 -l' 不带单引号追加到该字符串后面, 因此 -! 标志的值此时变成了 /usr/lib/lpd/pio/fmtrs/piof5202 -l。 The -l is a flag to piof5202, the device-dependent formatter for an ASCII data stream on an IBM 4029 LaserPrinter, that specifies page width in characters.

有关计算-l标志的参数%IwL 的信息,请参阅使用打印机冒号文件转义序列计算页面长度