Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
QNX 4 Руководство пользователя.doc
Скачиваний:
248
Добавлен:
02.05.2014
Размер:
1.02 Mб
Скачать

Глава 10. Буферизация печати

В этой главе...

Использование утилит буферизации

Архитектура системы буферизации

Файл установки буферизации

Использование файла установки

Примеры файлов установки

Доступ к системам буферизации и очередям

10.1. Введение

10.1.1. Разделение ресурсов в сети

QNX обеспечивает распределение ресурсов сети с некоторыми ис-

кусственными ограничениями. Каждое устройство (диск, модем, принтер

и т.п.), подключенное к компьютеру по умолчанию является коллектив-

ным ресурсом.

Таким образом, программа, работающая на любом компьютере, име-

ет равный доступ к любому устройству в сети, независимо от того,

подключено устройство к тому же самому компьютеру (локальное) или к

другой машине (удаленное).

Хотя пользователь, в принципе, может получить доступ к любым

ресурсам в сети, Системный администратор, вероятно, должен принять

меры, чтобы контролировать доступ к определенным типам ресурсов.

Принтеры и модемы, например, могут использоваться в данный мо-

мент только одним пользователем (в отличие от жестких дисков, с ко-

торыми могут работать параллельно многие пользователи) и, следова-

тельно, требуется организовать формирование очереди, чтобы избежать

конфликтов.

Для обеспечения удобного доступа к этим распределенным ресур-

сам в системе QNX имеется множество сервисных средств буферизации.

10.1.2. Буферизация

Система буферизации - механизм, который принимает запросы к

ресурсу и затем распределяет использование ресурса в соответствии с

инструкцией, которая была задана.

Для того, чтобы понять, как использовать систему буферизации,

давайте рассмотрим, как система буферизации управляет доступом к

принтеру.

Принтер должен быть постоянно доступен пользователям, хотя он

может выполнять в данный момент только одно задание. Если имеется

- 113 -

система буферизации, то пользователи могут послать данные через эту

систему, а не непосредственно на принтер. Получая данные, предназ-

наченные для принтера, система буферизации записывает эти данные во

временный файл, а не передает их немедленно на принтер. Позже, ког-

да принтер становится доступным, система буферизации передает дан-

ные на принтер.

Таким образом, многие пользователи могут свободно подавать за-

дания на печать, даже если существует только один физический прин-

тер. QNX поддерживает буферизацию с помощью именованных очередей, к

которым обращается набор утилит "lp"; эти очереди также существуют

в файловом пространстве в каталоге /dev/spool.

Данные, записанные в очередь, будут помещаться во внутренний

список и в конце концов передаваться на определенное устройство вы-

вода. Сервер буферизации QNX:

lpsrvr

Этот сервер может поддерживать несколько очередей буферизации.

Следующие утилиты работают с очередями буферизации:

lp помещает файлы в очереди буферизации

lprm удаляет задания из очередей буферизации

lpc управляет очередями буферизации

lpq отображает состояние очередей буферизации

Для получения дополнительной информации об этих утилитах смот-

рите "Utilities Referencе".

10.2. Использование утилит буферизации

10.2.1. Запуск системы буферизации

Прежде чем любая буферизация cможет осуществиться в системе

QNX, Вы должны запустить сервер буферизации lpsrvr:

lpsrvr &

Для того, чтобы определить, какие ресурсы доступны и как уп-

равлять ими, утилита lpsrvr сначала ищет файл установки с именем

/etc/config/lpsrvr.node (где node - ID узла, на котором работает

lpsrvr). Если файл установки с расширением node не обнаруживается,

lpsrvr будет использовать файл /etc/config/lpsrvr. Этот файл нахо-

дится на стандартных дистрибутивных дискетах QNX.

- 114 -

10.2.2. Представление заданий на буферизацию

Следующая команда lp поставит файл report в очередь буфериза-

ции по умолчанию (дополнительно об этой очереди смотрите в разделе

"Установка файла буферизации") и в конце концов распечатает его:

lp report

В системах, где имеется более одной очереди буферизации, Вы

можете определить имя очереди. Следующая команда включает report в

очередь буферизации с именем txt:

lp -P txt report

Для записи непосредственно в файл очереди Вы также можете ис-

пользовать команду cp:

cp /dev/spool/txt

10.2.3. Организация очереди на буферизацию

Для того, чтобы проверить очередь буферизации, Вы можете ис-

пользовать утилиту lpq. Ниже приведен пример выводимой утилитой lpq

информации:

1: steve [job #39] 1400 bytes lalist.doc

2: aboyd [job #42] 2312 bytes netdrvr.c

Эта утилита позволит Вам определить, когда были завершены по-

данные на выполнение задания; она также позволит определить ID за-

дания буферизации для использования его другими утилитами lp.

10.2.4. Отмена заданий на буферизацию

Утилита lprm позволяет Вам удалять задания из очереди буфери-

зации. Вы можете удалить задание явно, указав его ID. Для очереди,

показанной выше, задание steve (#39) может быть отменено следующей

командой:

lprm 39

Если задание #39 в данный момент времени обрабатывается, то

оно будет завершено. Успешность завершения текущих заданий буфери-

зации может зависеть от типа устройства вывода, который Вы исполь-

- 115 -

зуете: некоторые принтеры имеют большие внутренние буфера.

Суперользователь может также удалить все задания, принадлежащие конк-

ретному пользователю. Например, все задания steve могут быть отменены

следующей командой:

lprm steve

10.2.5. Управление очередями на буферизацию

Утилита lpc - системное административное средство для управле-

ния системами буферизации. Она позволяет Вам выполнять многие уп-

равляющие функции, например, открытие или закрытие очереди.

Обеспечиваются следующие базовые функции:

- приостановить/возобновить включение заданий в очередь;

- приостановить/возобновить удаление заданий из очереди;

- приостановить/возобновить выполнение текущего задания;

- удалить текущее задание; - перестроить задания в очереди;

- переместить задания в другую очередь;

- отобразить состояние очередей.

Имейте в виду, что функциональные возможности lpc перекрывают

возможности lpq и lprm. Это удобно, т.к. в отличие от lpq и lprm,

lpc может использоваться в диалоговом режиме.

10.3. Архитектура системы буферизации

В основе системы буферизации QNX лежат два объекта: очереди и

адресаты. Они работают друг с другом, обеспечивая гибкий метод пре-

образования данных и организации очередей.

Очередь - это внутренний список задержанных данных, которые

нужно послать адресату.

Как отмечалось ранее, каждая очередь получает имя, которое

пользователи определяют при запуске заданий. Адресат связывается с

физическим устройством вывода (например, принтером) и удаляет зада-

ния из очередей. Вы можете соединить выход очереди с одним или бо-

лее адресатами или соединить несколько очередей с единственным ад-

ресатом.

Однако, Вы можете соединить выход адресата только с одним уст-

ройством.

Очереди могут иметь дополнительные атрибуты, называемые филь-

трами.

Есть два типа фильтров:

- входные фильтры (copy-in) (ci), которые выполняют операции с

- 116 -

данными прежде, чем они скопируются в очередь (например, форматиро-

вание);

и выходные фильтры (copy-out) (со), которые оперируют с данны-

ми после исключения из очереди.

Адресаты могут иметь дополнительную управляющую программу

(cp), которая позволяет, если потребуется, инициализировать уст-

ройство вывода между заданиями.

Например, если выполнение задания преждевременно прекратилось

и устройство необходимо снова перевести в исходное состояние, прог-

рамма, управляющая устройством, должна обнаружить SIGTERM и опреде-

лить, какое действие необходимо выполнить, чтобы перевести устройс-

тво в устойчивое состояние.

Следующие схемы иллюстрируют, каким образом могут быть скомпо-

нованы очереди, фильтры и адресаты, чтобы работать друг с другом.

Необязательные элементы выделены курсивом.

Одна очередь для одного адресата

Следующая конфигурация может использоваться там, где есть один

принтер и требуется одна (или никакая) передача данных (например,

точечный матричный принтер):

+------------------------------------------------------------------+

Ё Ё

Ё очередь адресат Ё

Ё +----------------------------+ +----------------+ Ё

Ё +---+ +-----------+ +---+ +---+ Ё

Ё --->Ёci +--->Ё Ё Ё +---Ёco +----------Ёcp +----->устройствоЁ

Ё +---+ +-----------+ +---+ +---+ Ё

Ё Ё

Ё Ё

+------------------------------------------------------------------+

Рис.17

Несколько очередей для одного адресата

У одного адресата может быть несколько очередей. В этом случае

адресат выберет из всех заданий в очередях подходящее задание, ос-

новываясь на приоритете очереди и времени ожидания (то есть самое

задержанное задание).

.

- 117 -

+------------------------------------------------------------------+

Ё Ё

Ё +---+ +-----------+ +---+ +---+ Ё

Ё --->Ёci +--->Ё Ё Ё +---Ёco +---------Ёcp +----->устройство Ё

Ё +---+ +-----------+ +---+ +---+ Ё

Ё +---+ +-----------+ +---+ Ё Ё

Ё --->Ёci +--->Ё Ё Ё +---Ёco +-----+ Ё

Ё +---+ +-----------+ +---+ Ё

Ё Ё

+------------------------------------------------------------------+

Рис. 18

В конце этой главы Вы найдете несколько примеров файлов уста-

новки.

Вышеуказанная конфигурация используется в примере, в котором

одна очередь преобразует ASCII в PostScript, а другая - просто оче-

редь PostScript. Обе очереди имеют один и тот же адресат, который

посылает данные на лазерный принтер PostScript.

Одна очередь для нескольких адресатов

Если выход очереди передается на несколько адресатов, система

буферизации выберет любой доступный адресат.

Следующая конфигурация пригодна в том случае, если имеется три

принтера и не имеет значения, какой из них печатает Ваше задание.

+------------------------------------------------------------------+

Ё +---+ +-----------+ +---+ +---+ Ё

Ё --->Ёci +--->Ё Ё Ё +---Ёco Ё----------Ёcp Ё----->устройствоЁ

Ё +---+ +-----------+ +---+ +---+ Ё

Ё Ё +---+ Ё

Ё +-----Ёcp Ё----->устройствоЁ

Ё Ё +---+ Ё

Ё Ё +---+ Ё

Ё +-----Ёcp Ё----->устройствоЁ

Ё +---+ Ё

+------------------------------------------------------------------+

Рис. 19

Несколько очередей для нескольких адресатов

Следующая конфигурация - комбинация двух предшествующих приме-

- 118 -

ров.

Третья очередь имеет отдельный канал для одного из адресатов.

Этот канал используется, чтобы гарантировать передачу заданий всег-

да на третий принтер (например, принтер имеет цветные возможности).

+------------------------------------------------------------------+

Ё +---+ +-----------+ +---+ +---+ Ё

Ё --->Ёci +--->Ё Ё Ё +---Ёco Ё----------Ёcp Ё----->устройствоЁ

Ё +---+ +-----------+ +---+ Ё +---+ Ё

Ё +---+ +-----------+ +---+ Ё Ё Ё

Ё --->Ёci +--->Ё Ё Ё +---Ёco Ё--+ Ё Ё

Ё +---+ +-----------+ +---+ Ё Ё

Ё Ё +---+ Ё

Ё +----Ёcp Ё----->устройствоЁ

Ё Ё +---+ Ё

Ё Ё +---+ Ё

Ё +----Ёcp Ё----->устройствоЁ

Ё +---+ Ё

Ё +---+ +-----------+ +---+ Ё Ё

Ё --->Ёci +--->Ё Ё Ё +---Ёco Ё------+ Ё

Ё +---+ +-----------+ +---+ Ё

+------------------------------------------------------------------+

Рис. 20

Сцепление очередей

Выход очереди обычно подключается к одному или более адресатам

и, кроме того, существует возможность подключения его к другой оче-

реди. При сцеплении выход одной очереди подключается непосредствен-

но ко входу другой очереди, в результате чего не нужны никакие опе-

рации с входными фильтрами для этой очереди. Если конечная очередь

в цепи имеет выходной фильтр, то он и будет использоваться.

+------------------------------------------------------------------+

Ё +---+ +-----------+ +---+ Ё

Ё --->Ёci +--->Ё Ё Ё +---Ёco Ё-----+ Ё

Ё +---+ +-----------+ +---+ Ё Ё

Ё +----------------------------+ Ё

Ё Ё Ё

Ё +---+ +-----------+ +---+ +---+ Ё

Ё --->Ёci +--->Ё Ё Ё +---Ёco Ё----------Ёcp Ё----->устройствоЁ

Ё +---+ +-----------+ +---+ +---+ Ё

+------------------------------------------------------------------+

Рис. 21

- 119 -

10.4. Файл установки буферизации

После запуска система буферизации обращается к файлу, чтобы

получить информацию о конфигурации. Если никакой файл не задан в

командной строке, то система буферизации использует файл /etc/con-

fig/lpsrvr. Этот файл определяет очереди, адресаты и связь между

ними.

10.4.1. Синтаксические определения

Очереди и адресаты имеют символические имена, а также комплект

атрибутов. Каждый элемент файла установки имеет следующий формат:

[name]

attribute

attribute

.

.

.

Определение очереди или адресата начинается с директивы [name]

и включает до следующей директивы [name] все допустимые технические

спецификации.

Все начальные пробелы игнорируются.

Строки комментариев начинаются со знака #. Если один атрибут

занимает две строки, то последним символом перед символом <конец

строки> должен быть: <\>.

Имя может иметь до 48 символов и может содержать только текс-

товые символы.

Если описываемый объект - адресат, то перед именем должно быть

тире (-). Тире не считается частью имени. Каждый атрибут состоит из

двухсимвольного ключа в одной из следующих форм:

key логическая величина

key#number числовая

key=string символьная

Все числа считаются десятичными, если они не начинаются с нуля

(означающего 8-ричное представление) или с комбинацииx (означающей

16-ричное представление).

Все строки содержат печатные символы.

Обратная косая черта (\) -"специальный" символ. Он может ис-

пользоваться для перехода на другие символы.

Например, "реальная" обратная косая черта должна быть предс-

тавлена как: \.

Следующая таблица описывает все заданные ключи, включая значе-

- 120 -

ния, используемые по умолчанию для каждого ключа, если его соот-

ветствующий атрибут не определен.

-------------------------------------------------------------------

Ключ: ЁОписание Ё По умолчанию ЁИсп.*

-----------+------------------------+------------------------+-----

ab=string ЁВыполняется, когда адре-Ё Пустая строка; никакаяЁ T

Ёсат прекращает выполне-Ё команда не выполняется Ё

Ёние команды по какой-ни-Ё Ё

Ёбудь причине Ё Ё

-----------+------------------------+------------------------+-----

af=string ЁФайл регистрации, кото-Ё Регистрация не выполня-Ё Q

Ёрый могут использоватьЁ ется Ё

Ёкоманды Ё Ё

-----------+------------------------+------------------------+-----

cd=string ЁКаталог, в котором нахо-Ё /usr/spool/lp Ё G

Ёдятся временные файлыЁ Ё

Ёбуферизации Ё Ё

-----------+------------------------+------------------------+-----

ci=string ЁКоманда copy-in; исполь-Ё Двоичное копирование Ё Q

Ёзуется перед постановкойЁ задания Ё

Ёзадания в очередь безЁ Ё

Ёпреобразования Ё Ё

-----------+------------------------+------------------------+-----

co=string ЁКоманда copy-out;исполь-Ё Двоичное копирование заЁ Q

Ёзуется при удалении за-Ё дания без преобразова-Ё

Ёдания из очереди Ё ния Ё

-----------+------------------------+------------------------+-----

cp=string ЁПрограмма управления ус-Ё Двоичная копия задания.Ё T

Ётройством; используется Ё Без преобразования Ё

Ёадресатом Ё Ё

Ё Ё Ё

-----------+------------------------+------------------------+-----

dv=string ЁУстройство, которое ис-Ё Направляется на стан- Ё Q,T

Ёпользует адресат Ё дартный вывод lpsrvr Ё

-----------+------------------------+------------------------+-----

mn#numeric ЁМинимальное количествоЁ 0; очереди разгружаютсяЁ Q

Ёзаданий в очередях доЁ как только возможно Ё

Ёначала разгрузки Ё Ё

-----------+------------------------+------------------------+-----

mx#numeric ЁМаксимальное количествоЁ Без ограничения; огра-Ё Q

Ёзаданий, которое содер-Ё ничение - имеющаясяЁ

Ёжит очередь Ё оперативная и дисковаяЁ

Ё Ё память Ё

- 121 -

-------------------------------------------------------------------

Ключ: ЁОписание Ё По умолчанию ЁИсп.*

-----------+------------------------+------------------------+-----

na=string ЁИмя; строка, которая Ё Пустая строка Ё Q,T

Ёописывает очередь илиЁ Ё

Ёадресата Ё Ё

-----------+------------------------+------------------------+-----

ok=string ЁКоманда, выполняемая приЁ Пустая строка; никакиеЁ T

Ёнормальном завершенииЁ действия не выполняютсяЁ

Ёработы адресата Ё Ё

-----------+------------------------+------------------------+-----

pr#numeric ЁПриоритет выполненияЁ 50 Ё Q

Ёданной очереди (1-100);Ё Ё

Ё100 - самый высокий Ё Ё

-----------+------------------------+------------------------+-----

qn=string ЁОчередь, в которую уста-Ё Пустая строка; заданиеЁ Q

Ёнавливается задание пос-Ё удаляется из буфера Ё

Ёле извлечения из буфера Ё Ё

-----------+------------------------+------------------------+-----

sp=string ЁРегистрация имени систе-Ё Регистрируется /qnx/ Ё G

Ёмы буферизации, содержа-Ё spooler, если не зада- Ё

Ёщей данную очередь Ё но другое имя очереди Ё

-----------+------------------------+------------------------+-----

ta=string ЁАдресат, связанный с ЁСтандартный вывод lpsrvrЁ Q

Ёэтой очередью Ё Ё

-----------+------------------------+------------------------+-----

wa#numeric ЁЗадержка задания на ука-Ё 0; задания извлекаютсяЁ Q

Ёзанное количество секундЁ из буфера немедленно Ё

Ёперед извлечением его изЁ Ё

Ёбуфера Ё Ё

-------------------------------------------------------------------

* Q=очередь; T=адресат; G=глобально

Т.к. ключи зависят от регистра клавиатуры, то Quantum резер-

вирует все ключи, сформированные на нижнем регистре. Вы можете сами

формировать пользовательские расширения, используя верхний регистр

или комбинацию верхнего и нижнего регистра. Утилиты системы буфери-

зации игнорируют любые опции, которые они не понимают.

10.4.2. Глобальные ключевые слова

Два ключевых слова sp и cd, могут определять глобальную инфор-

мацию для системы буферизации. Для того, чтобы указать, что они

применяются глобально, этим ключевым словам предшествует пара пус-

- 122 -

тых скобок ([]).

Регистрация имен - sp

Т.к. система буферизации всегда настроена на пространство имен

файла /dev/spool, то на каждом узле может работать только одна сис-

тема буферизации. Вы можете запустить несколько систем буферизации

в Вашей сети, если каждая система буферизации будет регистрировать-

ся под разными глобальными именами. В противном случае, каждая сис-

тема буферизации будет пытаться регистрироваться под принятым по

умолчанию одним и тем же глобальным именем: /qnx/spooler.

При наличии нескольких систем буферизации можно использовать

такие имена, как, например, /qnx/spooler2, /qnx/spooler3 и так да-

лее.

Для того, чтобы определить глобальное имя, которое нужно ре-

гистрировать для системы буферизации, необходимо использовать ко-

манду sp в файле установки. Имя всегда должно начинаться с наклон-

ной черты вправо (/).

Если ключевое слово sp не определено, то по умолчанию регист-

рируется глобальное имя /qnx/spooler (то есть во всей сети).

Определение временного каталога для файлов буферизации - cd

Ключевое слово cd позволяет Вам определить каталог, используе-

мый для создания временных файлов буферизации. По умолчанию, вре-

менные файлы создаются в каталоге /usr/spool/lp. Эти файлы удаляют-

ся, когда они больше не требуются. Любой путь, который Вы определя-

ете в ключевом слове cd должен начинаться с ведущей наклонной черты

вправо. Имейте в виду, что задаваемый каталог должен иметь соот-

ветствующие права доступа. В следующем примере в файле установки

регистрируется имя системы буферизации /qnx/spooler2, а также уста-

навливаются временные файлы в каталог /tmp/spool2:

# Глобальные переменные системы буферизации

[]

sp=/qnx/spooler2

cd=/tmp/spool2

# Текстовая очередь

[txt]....

.

- 123 -

10.4.3. Метапеременные

Система буферизации устанавливает следующие метапеременные:

-------------------------------------------------------------------

Переменная: Описание:

-------------------------------------------------------------------

$(file) Имя подаваемого файла или "--standardinput--", если

имя не определено

$(fname) Полное имя подаваемого на вход файла или "--standar-

dinput--", если никакое имя не определено

$(spfile) Имя буферного файла данных

$(username) Входное имя пользователя, который запустил задание

$(userid) ID пользователя, который запустил задание

$(queue) Имя очереди, в которую в настоящее время устанавли-

вается задание

$(target) Имя адресата, к которому в настоящее время направ-

ляется задание

$(device) Имя устройства, для которого планируется выполнение

задания

$(ncopies) Количество копий, запрашиваемых пользователем

$(jobid) ID этого задания

-------------------------------------------------------------------

Кроме того, все определенные выше ключи можно рассматривать,

как метапеременные. Например, $ (ci) расширяется в имя команды

входного фильтра: ci=string.

10.4.4. Действия по умолчанию

Команда cat используется по умолчанию в качестве фильтрующих

команд входного и выходного фильтров. Если не указано особо в файле

установки, то стандартный ввод и стандартный вывод команд фильтра

автоматически подключается, по умолчанию, к файлам или процессам.

Значение по умолчанию для входного фильтра следующee:

- 124 -

cat < $(fname) > $(spfile)

Есть две возможности для выходного фильтра, которые определя-

ются наличием управляющей программы (то есть, cp):

cat < $(spfile) > $(device)

cat < $(spfile) | $(cp) > $(device)

Например, следующий файл установки:

[txt]

ta=lpt

ci=pr -f -h

co=txt2ps

cp=init_printer

[-lpt] dv=/dev/par

в результате дает следующие подстановки:

pr -f -h < $(fname) > $(spfile)

txt2ps < $(spfile) | init_printer > /dev/par

10.5. Использование файлов установки

10.5.1. Очереди и адресаты

В файле установки Вы определяете каждую очередь, давая ей имя

и дополнительный список параметров; Вы определяете каждый адресат,

начиная его имя с тире (-).

Для того, чтобы проиллюстрировать это, рассмотрим простой файл

установки:

[txt]

ta=lpt

[-lpt]

dv=/dev/par

В этом файле у нас есть очередь с именем txt и адресат с име-

нем lpt. Когда данные посылаются в очередь буферизации txt, они

сохраняются во временном буферном файле и именуются "заданием."

Когда система буферизации удаляет задание из очереди, задание пере-

дается адресату lpt, который затем направляет данные в параллельный

- 125 -

порт /dev/par.

10.5.2. Фильтры

Часто приходится фильтровать буферизованные данные, для чего

lpsrvr имеет механизмы входного и выходного фильтрования. Как было

упомянуто выше, входное фильтрование выполняется до размещения дан-

ных в очереди, а выходное - после того, как данные удаляются из

очереди.

Имейте в виду, что, если несколько очередей передают данные

одному адресату и одна из очередей имеет входной фильтр, который

требует длительного выполнения, то адресат будет временно недосту-

пен для остальных очередей, если такая очередь выбрана (для полу-

чения дополнительной информации смотрите раздел "Примеры файлов ус-

тановки".)

ВНИМАНИЕ. Рекомендуется метапеременные заключать в двойные ка-

вычки, чтобы обеспечить их защищенность для команды.

Использование входного фильтра

Ниже приведен пример использования входного фильтра при пере-

даче данных через pr для форматирования:

[txt]

ci=pr -f -h "$(file)"

ta=lpt

[-lpt]

dv=/dev/par

Использование выходного фильтра

Вы могли бы использовать выходной фильтр, например, для однов-

ременной работы с лазерными принтерами PostScript и HP. Два выход-

ных фильтра могут сгенерировать соответствующие выходные форматы.

Скажем, у Вас есть две программы: txt2ps, которая генерирует Post-

Script и txt2hpgl, которая генерирует hpgl:

[ps ]

ta=lpt1

co=txt2ps

[hp]

ta=lpt2

- 126 -

co=txt2hpgl

[-lpt1]

dv=/dev/ser

[-lpt2]

dv=/dev/par

ВНИМАНИЕ. Не кодируйте жестко устройство вывода в определении

выходного фильтра; используйте для этой цели адреса-

ты. Адресаты должны иметь исключительное право дос-

тупа к устройству и должны быть единственными средс-

твами доступа в пределах системы буферизации.

10.5.3. Сцепление очередей

Очереди могут быть сцеплены, это позволяет перемещать задания

из очереди в очередь. Ниже приведен простой пример сцепления с оче-

редью с именем tmp, которая посылает данные в адресат lpt:

[txt]

qn=tmp

[tmp]

ta=lpt

[-lpt]

dv=/dev/par

10.5.4. Регистрация информации

Ключевое слово af позволяет определить имя файла, к которому

команды могут получить доступ через $(af) и, таким образом, запи-

сать любую информацию, которую они хотят зарегистрировать.

10.5.5. Трактовка ошибок

Ошибки ввода. Утилита lp дает некоторые ошибки, которые появ-

ляются во время ввода данных в очередь. Если Вы вводите данные, за-

писывая их непосредственно в буферный файл в каталог /dev/spool,

ошибки появляются в том случае, если что-либо препятствует успешной

записи в очередь.

Ошибки вывода. Вы можете использовать ключевое слово ab, чтобы

определить команду для выполнения в случае, если адресат отказыва-

ется от задания. Следующая команда будет информировать пользователя

об ошибке через сообщение почты:

- 127 -

ab=echo lpsrvr print job $(jobid), file $(file) failed \

| mailx $(username)

10.6. Примеры файлов установки

10.6.1. Несколько очередей к одному адресату

В следующем примере показано несколько очередей, которые имеют

один общий адресат. Три очереди названы:

txt (ASCII текстовые файлы)

ps (файлы PostScript)

gif (файлы графического формата)

Конфигурация выглядит следующим образом:

+-----------------------------------------------------------------+

Ё (txt) +-------+ +-----------+ (lpt) Ё

Ё------>Ёtext2ps+--->Ё Ё Ё +--------------------->/dev/par Ё

Ё +-------+ +-----------+ Ё Ё

Ё (ps) +-----------+ Ё Ё

Ё------------------->Ё Ё Ё +-------Ё Ё

Ё +-----------+ Ё Ё

Ё (gif) +-------+ +-----------+ Ё Ё

Ё------>Ёgif2ps +--->Ё Ё Ё +-------+ Ё

Ё +-------+ +-----------+ Ё

+-----------------------------------------------------------------+

Рис. 22

Файл, определяющий эту установку, имеет следующий вид:

# ASCII в очередь PostScript:

[txt]

ta=lpt

ci=text2ps

pr#50

# прямая очередь PostScript:

[ps]

ta=lpt

pr#60

# GIF в очередь Postscript:

- 128 -

[gif]

ta=lpt

ci=gif2ps

pr#5

# принтер адресата:

[-lpt]

dv=/dev/par

В этом примере пользователи, используя утилиту lp, посылают

файлы в соответствующую очередь с входным фильтром, который преоб-

разовывает файл (за исключением очереди ps). Затем очередь передает

преобразованные данные адресату /dev/par. Т.к. для гипотетических

фильтрующих программ text2ps и gif2ps может потребоваться большое

количество времени для выполнения задания, то вместо выходных филь-

тров используются входные фильтры. На время работы выходного филь-

тра адресат блокируется, тем самым задерживая извлечение других за-

даний из очереди. Выбранная конфигурация позволяет посылать другие

задания адресату, пока генерируется перевод в PostScript. Кроме то-

го, т.к. графические файлы имеют большой размер, им назначен более

низкий приоритет, чем другим.

10.6.2. Несколько очередей к трем адресатам

Следующий пример является дальнейшим развитием установки,

рассмотренной выше, с некоторыми дополнительными особенностями, не-

обходимыми для расширенной конфигурации. Теперь имеется три лазер-

ных принтера PostScript, расположенные в разных частях здания

(подключенные к //1/dev/ser1, //2/dev/ser1 и //3/dev/ser1). Конфи-

гурация будет выглядеть следующим образом:

+-----------------------------------------------------------------+

Ё (txt) +-------+ +-----------+ (lp1) Ё

Ё------>Ёtext2ps+--->Ё Ё Ё +------------------>//1/dev/ser1 Ё

Ё +-------+ +-----------+ Ё Ё Ё

Ё (ps) +-----------+ Ё Ё (lp2) Ё

Ё------------------->Ё Ё Ё +------Ё +------>//2/dev/ser1 Ё

Ё +-----------+ Ё Ё Ё

Ё (gif) +-------+ +-----------+ Ё Ё (lp3) Ё

Ё------>Ёgif2ps +--->Ё Ё Ё +------+ +------>//3/dev/ser1 Ё

Ё +-------+ +-----------+ Ё

+-----------------------------------------------------------------+

Рис. 23

- 129 -

Файл для такой установки имеет вид:

# ASCII в очередь PostScript:

[txt]

ta=lp1,lp2,lp3

ci=text2ps

pr#50

# прямая очередь PostScript:

[ps]

ta=lp1,lp2,lp3

pr#60

# GIF в очередь PostScript:

[gif]

ta=lp1,lp2,lp3

ci=gif2ps

pr#5

# принтеры адресата:

[-lp1]

dv=//1/dev/ser1

ok=echo file $(fname) sent to $(target) | mailx $(username)

ab=echo file $(fname) did not get printed | mailx

$(username)

[-lp2]

dv=//2/dev/ser1

ok=echo file $(fname) sent to $(target) | mailx $(username)

ab=echo file $(fname) did not get printed | mailx

$(username)

[-lp3]

dv=//3/dev/ser1

ok=echo file $(fname) sent to $(target) | mailx $(username)

ab=echo file S(fname) did not get printed | mailx

$(username)

Вышеуказанная конфигурация использует те же три очереди (txt,

ps, и gif), описанные раньше, но теперь они выходят на три отдель-

- 130 -

ных адресата.

Система буферизации выбирает первый доступный адресат из набо-

ра адресатов (lp1, lp2, lp3) и посылает данные на соответствующий

принтер. Выбор из очереди производится сначала по приоритету, затем

по времени нахождения задания в очереди. В этом примере инициатору

задания посылается почтовое сообщение, информируя его о нормальном

или ненормальном завершении задания.

10.7. Доступ к программам буферизации и очередям

Многие системы буферизации могут работать в сети, каждая из

них может поддерживать несколько очередей. Для того, чтобы связать-

ся с любой системой буферизации, утилиты lp сначала определяют уни-

кальное глобальное имя системы буферизации, с которым она была за-

регистрирована (смотрите раздел "Глобальные ключевые слова"). При

использовании любой утилиты lp Вы можете определять систему буфери-

зации и очередь различными путями.

Вы можете:

- не задавать имя каксистемы буферизации, так и очереди;

- задавать имя только системыбуферизации;

- задавать имя только очереди;

- задавать имена как системы буферизации так и очереди.

Если Вы не задаете имя системы буферизации в командной строке,

то утилита lp проверяет внешнюю переменную LPSRVR, которая содержит

имя системы буферизации, принятое по умолчанию. Однако, если LPSRVR

не определена, то утилита lp будет использовать систему буфериза-

ции, которая зарегистрирована по умолчанию под глобальным именем:

/qnx/spooler

Если утилита lp успешно определила систему буферизации, но Вы

не задали в командной строке имя очереди, то утилита lp проверит

внешнюю переменную LPDEST, которая содержит имя очереди, принятое

по умолчанию. Однако, если LPDEST не определена, то утилита lp бу-

дет использовать первую очередь в файле установки для уже заданной

системы буферизации.

10.7.1. Переменные LPSRVR и LPDEST

Внешние переменные LPSRVR и LPDEST используются, когда инфор-

мация командной строки, передаваемая утилитам lp, полностью не оп-

ределяет, какую систему буферизации или очередь использовать.

- 131 -

LPSRVR определяет имя системы буферизации, принимаемое по

умолчанию. Следующее определение LPSRVR задает одну систему буфери-

зации с именем /qnx/spooler2:

export LPSRVR=/qnx/spooler2

Имя, определенное в LPSRVR, должно всегда начинаться с ведущей

наклонной черты вправо. LPSRVR никогда не должна содержать имя оче-

реди.

LPDEST определяет имя очереди, принимаемое по умолчанию. Вы

можете использовать LPDEST двумя способами. Вы можете только опре-

делить очередь:

export LPDEST=waybills

Или Вы можете определить систему буферизации и очередь:

export LPDEST=/qnx/spooler2/waybills

------------ -------

Ё ЁОчередь

ЁСистема

Ёбуферизации

Если Вы определяете систему буферизации в переменной LPDEST,

то переменная LPSRVR игнорируется, даже если она и определена.

ВНИМАНИЕ. Если LPDEST не определена, то для совместимости ути-

литы lp смотрят на традиционную UNIX-переменную

PRINTER.

10.7.2. Примеры

Рассмотрим несколько простых примеров, которые показывают не-

которые способы задания систем буферизации и очередей. Для этих

примеров предположим, что имеется две системы буферизации, каждая с

двумя очередями. Первая система буферизации использует по умолчанию

глобальное имя /qnx/spooler; его очереди названы txt и ps. Вторая

система буферизации использует имя /qnx/spooler2, его очереди наз-

ваны cheques и waybills.

.

- 132 -

Первая система буферизации: Вторая система буферизации:

/qnx/spooler/txt /qnx/spooler2/cheques

/qnx/spooler/ps /qnx/spooler2/waybills

Имена системы буферизации и очереди не заданы

Скажем, Вы вводите следующую команду lp, не задавая имена ни

системе буферизации, ни очереди:

lp test.dat

Сначала утилита будет пытаться определить систему буферизации,

проверяя LPSRVR. Если эта переменная не определена, то утилита оп-

ределит для системы буферизации принятое по умолчанию глобальным

имя /qnx/spooler. Затем утилита будет пытаться определить имя оче-

реди, проверяя LPDEST. Если эта переменная не определена, то утили-

та выберет первую очередь, определенную в файле установки для ранее

определенной системы буферизации.

Задано только имя системы буферизации:

Если Вы определяете строку, которая начинается с ведущей нак-

лонной черты вправо, то строка всегда считается именем системы бу-

феризации. Таким образом, если Вы введете следующую команду, то

утилита рассмотрит имя /qnx/spooler2, как имя системы буферизации:

lp -P /qnx/spooler2 test.dat

Т.к. вторая система буферизации имеет имя /qnx/spooler2, то

эта система буферизации и будет определена. Затем утилита будет пы-

таться получить имя очереди из переменной LPDEST. Если LPDEST не

определена, то задание передается очереди cheques, т.к. она являет-

ся первой очередью в файле установки /qnx/spooler2.

Задано только имя очереди:

Если Вы определяете строку, которая не начинается с ведущей

наклонной черты вправо, то строка всегда считается именем очереди.

Таким образом, если Вы введете следующую команду, то утилита lp

рассмотрит txt, как очередь:

lp -P txt test.dat

- 133 -

Утилита lp сначала будет пытаться определить систему буфериза-

ции, проверяя LPSRVR. Если эта переменная не определена, то утилита

lp будет использовать первую систему буферизации, т.к. эта система

зарегистрировала глобальное имя /qnx/spooler, принятое по умолча-

нию.

Заданы имена как системы буферизации, так и очереди:

В следующем примере как системе буферизации, так и очереди

присвоены имена. Т.к. строка начинается с ведущей наклонной черты

вправо, утилита lp сначала будет пытаться обнаружить систему буфе-

ризации с именем /qnx/spooler2/waybills.

lp -P /qnx/spooler2/waybills test.dat

Однако, т.к. системы буферизации с именем /qnx/spooler2/way-

bills не существует, утилита будет рассматривать данную строку, как

имя системы буферизации, за которой следует имя очереди. При этом

будет определена система буферизации с именем /qnx/spooler2, и за-

дания будут передаваться очереди waybills в этой системе буфериза-

ции.

10.7.3. Файлы инициализации

Можно сформировать несколько систем буферизации, задаваемых по

умолчанию, если, например, Ваши отделы маркетинга, продаж и техот-

дел имеют свои системы буферизации:

LPSRVR=/qnx/spooler отдел маркетинга

LPSRVR=/qnx/spooler2 отдел продаж

LPSRVR=/qnx/spooler3 техотдел

Вы должны присвоить значения внешним переменным в файлах сис-

темной инициализации. Для этого можно использовать один из следую-

щих файлов:

/etc/config/sysinit.node выполняется при загрузке;

/etc/default/login выполняется при входе в систему;

/etc/profile выполняется при каждом запуске командно-

го интерпретатора.

.

- 134 -