Любое определение виртуального принтера содержит атрибут mo. Атрибут mo задает команду для вызова программы интерфейса драйвера устройства. Программа интерфейса - это последний процесс конвейера обработки входного потока данных. Для очередей локальной программы буферизации с базовой программой piobe в качестве программы интерфейса применяется программа pioout. Эта программа называется программой интерфейса драйвера устройства, так как в качестве последнего процесса конвейера она открывает драйвер устройства на запись и записывает в него обработанный входной поток данных. Дополнительная информация приведена в разделе Поток данных общих заданий печати.
В программе буферизации базовой операционной системы предусмотрено средство, с помощью которого пользователь root может заменить часть конвейера обработки входного потока данных пользовательским кодом. В данном разделе приведен пример переопределения атрибута mo, для которого значение по умолчанию (полный путь к команде pioout) заменяется на полный путь к пользовательской программе доставки. Дополнительная информация приведена в разделе Краткие сведения о работе базовой программы.
Предположим, что у вас есть сервер терминалов, подключенный к сети Ethernet, которому выделен IP-адрес. У сервера терминалов есть определенное число асинхронных портов, к которым могут быть подключены терминалы ASCII, модемы, принтеры или другие асинхронные устройства. Пусть вендор сервера терминалов предоставил вам программу ts_print со следующими характеристиками:
(Очевидно, такая ситуация вполне возможна.)
Рассмотрим конкретный пример. Предположим, что у вас есть принтер IBM 4029 LaserPrinter, который нужно подключить к серверу терминалов через порт 11, а IP-адрес сервера терминалов равен 9.19.129.101. Вам нужно создать на сервере печати очередь, в которую пользователи смогут отправлять задания ASCII для печати на принтере 4029 сервера терминалов. Хотя вы можете выполнить эту задачу с помощью команды ts_print, удобнее воспользоваться фильтрами форматирования, которые могут одновременно управлять режимом работы принтера и входным потоком данных. Кроме того, вам необходимо получить последовательный доступ к принтеру.
Существует несколько способов выполнить эту задачу. Самый простой - создать локальную очередь ASCII не в специальном символьном файле каталога /dev, а в обычном файле. После создания очереди и связанного с ней виртуального принтера можно изменить определение виртуального принтера для применения команды ts_print.
Для создания очереди введите команду быстрого доступа SMIT smit mkquedev. Появится примерно следующее меню:
Добавить очередь печати
Поместите курсор на нужный элемент и нажмите Enter. Для прокрутки воспользуйтесь клавишами перемещения курсора.
# ТИП СОЕДИНЕНИЯ ОПИСАНИЕ local Принтер, подключенный к локальному хосту remote Принтер, подключенный к удаленному хосту ascii Принтер, подключенный к терминалу ASCII hpJetDirect Сетевой принтер (HP JetDirect) file Файл (из каталога /dev) other Пользовательская базовая программа
Выберите опцию file, а затем - тип принтера. После того как вы выберете IBM 4029 LaserPrinter (или другое значение), укажите имя файла из каталога /dev. В этот файл будут записываться обработанные задания, запущенные из созданной вами очереди. Можно задать любое имя файла, удовлетворяющее соглашению о присвоении имен базовой операционной системы. Рекомендуется создать файл, который будет применяться только для очередей типа file. Например, пользователь root может выполнить команду touch /dev/lxx, чтобы создать файл lxx в каталоге /dev.
Указав имя файла из каталога /dev, выберите имя очереди для каждого входного потока данных, поддерживаемого указанным ранее принтером. Предположим, что в данном примере для очереди ASCII было выбрано имя asc. В файле /etc/qconfig появится приблизительно следующая запись:
asc: device = lxx lxx: file = /dev/lxx header = never trailer = never access = both backend = /usr/lib/lpd/piobe
Любое задание печати, запущенное из очереди asc, будет обрабатываться с помощью конвейера, созданного программой piobe. Обработанный поток данных будет записываться в файл /dev/lxx. Это не соответствует вашей цели. Вам нужно, чтобы команда ts_print записывала вывод в порт 11 сервера терминалов, поэтому никакой файл не должен быть связан с очередью. Отредактируйте два новых раздела в файле /etc/qconfig и измените значение параметра file на FALSE, как показано ниже:
asc: device = lxx lxx: file = FALSE header = never trailer = never access = both backend = /usr/lib/lpd/piobe
Если вы теперь попытаетесь запустить задание из очереди, то вы не сможете просмотреть никакой вывод в файле или где-либо еще, за исключением сообщений об ошибках. Когда процесс qdaemon запускает базовую программу piobe, он передает ей дескриптор открытого файла, указанного в параметре file файла /etc/qconfig. Если значение этого параметра равно FALSE, то дескриптор файла не передается. Конечный получатель дескриптора файла - программа, на которую ссылается атрибут mo. По умолчанию атрибут mo ссылается на программу pioout, поэтому при запуске задания из рассматриваемой очереди у pioout не будет допустимого стандартного вывода, и обрабатываемое задание просто исчезнет.
Теперь, с помощью команды lsvirprt выберите определение виртуального принтера asc для изменения (Просмотр, форматирование и изменение определений виртуальных принтеров). Появится примерно следующее приглашение:
Для просмотра СПИСКА атрибутов введите Имя_атрибута1 ... (* - для просмотра всех атрибутов) Для ИЗМЕНЕНИЯ значения атрибута введите Имя_атрибута=Новое_значение Для ФОРМАТИРОВАНИЯ и РЕДАКТИРОВАНИЯ значения атрибута введите Имя_атрибута~v Для РЕДАКТИРОВАНИЯ файла атрибутов введите ~v Для завершения работы нажмите Enter:
Предположим, что программа ts_print установлена в каталоге /usr/bin. Тогда введите в приглашении:
mo=/usr/bin/ts_print -A 9.19.129.101 -P 11
Задания из очереди asc будут обрабатываться как локальные, но в конце конвейера выходной поток данных будет доставлен программой ts_print на порт 11 сервера терминалов, а не передан программой pioout драйверу устройства.
В общем случае атрибут mo определения виртуального принтера, связанного с очередью с базовой программой piobe, можно переопределить таким образом, чтобы обработанный поток данных доставлялся в любой файл или устройство по выбору пользователя, если он напишет соответствующую программу.