假脱机程序数据流(enq 命令)

命令 lplprqprtenq 可以用来将作业提交到假脱机程序等待处理。

enq 命令是假脱机程序的真正入口 点;lplprqprt 均将对它们自己的参数进行语法分析并构建队 enq 的调用。 作为 root 用户在 shell 提示符下执行以下步骤可以说明此操作:

  1. 输入 mount /bin/echo /bin/enq
  2. 输入 qprt -Pasc -fp -z1 -p12 -s courier -C -N 3 /etc/motd
  3. 输入 umount /bin/enq

步骤 2 中的 qprt 命令尝试将打印作业提交到假脱机程序,并把它放在名 为 asc 的队列上,该打印作业请求以旋转 90 度的 12 点 Courier 字体打印打印三份 message-of-the-day。 qprt 对其命令行参数进行语法分析,并构建一个参数向量传递到 enq。 当 qprt 命令尝试使用该参数向量调用 enq 时,取而代之,它将调用在 enq 命令上安装的 echo 命令。 由此,qprt 命令生成的参数向量将传递到 echo 命令,后者依次简单地将该参数向量回传到您的显示器。 此过程还将与 lplpr 一起使用。 除了说明 qprt 真的是 enq 的一个前端,此技术在您尝试找到如何将不受支持的标志放入假脱机程序时也是十分有用的。 请参阅 过滤器 以获取更多信息。

步骤 2 中 qprt 命令的执行将导致以下输出被写入 TERM 环境变量所指定的显示元素中:

-P asc -o -o -f -o p -z -o 1 -o -p -o 12 -o -s courier -C -N 3 /etc/motd

这是 qprt 命令的此特定实例生成的参数向量。 如果 echo 未安装 在 enq 之上,那么将执行以下作业提交命令:

enq -P asc -o -f -o p -o -z -o 1 -o -p -o 12 -o -s courier -C -N 3 /etc/motd

作业提交命令必须以一个或多个实际文件的名称结尾,这些文件应在基本操作系统可以访问的文件系统上。 即使队列设置为处理 除了打印作业以外的其他作业,这一点也成立。

注: 请确保您执行步骤 3。 否则,假脱机程序将被禁用。

直接或通过 lplprqprt 执 行 enq 命令时,该命令会为作业指定一个作业号。 缺省情况下,lp 将返回该作业号。 lprqprt 将不会返回作业号,除非您特别地使用标志来请求该作业号。

enq 会创建一个 JDF 并将它放在 /var/spool/lpd/qdir 中,接着将 JDF 的名称写到消息队列中,并向 qdaemon 发出信号(向它发送一个 SIGUSR2),告诉它存在新的 JDF。 接 着,qdaemon 从消息队列读取该 JDF 的名称、直接访问 JDF、读取包含在 JDF 中的数据,并将这些数据保存为它所维护的用来跟踪当前在假脱机程序中所有作业的内部数据结构。 在这个时间点,假脱机程序已经接受了作业。

JDF 是针对除队列状态查询以外的所有假脱机系统操作而创建的;虽然 JDF 的结构在打印请求、作业取消请求以及队列控制请求等等之间都不同,但仍只创建一个 JDF。 与 lpstat 具有相同功能的命令仍然调用 enq 来完成它们的工作,但既不会创建 JDF 也不会涉及到 qdaemon

qdaemon 确定作业排队所针对的设备可用时,qdaemon 将调用队列的后端,并将 JDF 指定的参数传递给它。 后端进程将处理该作业。