конфигурацию принтера, запомненную на диске. В предыдущих
разделах данной главы объясняется, как это сделать. Неко-
торые из более зависящих от принтера данных конфигурации -
это характеристики порта принтера: скорость передачи, чет-
ность и так далее.
2. Для принтеров, которые не представлены в базе данных
terminfo, вы можете добавить новый элемент, описывающий
возможности принтера. Эта база данных используется в двух
паралельных направлениях: экранирование запросов печати с
целью убедиться, что принятые запросы могут обрабатываться
нужным принтером и установка принтера так, что он готов
печатать запрос.
Например, если база данных terminfo не выдает принтер, ко-
торый может задавать длину страницы, запрошенную принте-
ром, то демон накопления отвергает запрос. С другой сторо-
ны, если она показывает, что может выдать такой принтер,
то та же самая информация используется интерфейсной прог-
раммой для инициализации принтера.
3. Для особенно сложных принтеров или, если вы хотите доба-
вить возможности, не обеспеченные стандартным обслуживани-
ем печати LP, вы можете изменить стандартную интерфейсную
программу. Эта программа отвечает за управление принтером:
она печатает страницу заголовка, инициализирует принтер и
вызывает фильтр для посылки копий файлов пользователя на
принтер.
4аb. Для обеспечения связи между приложениями, используемой
системой и принтерами, вы можете добавить медленные и
быстрые фильтры. Каждый тип фильтра может преобразовать
файл в другую форму, отображая один набор последователь-
ностей выхода в другой, например, и может обеспечить спе-
циальную установку, интерпретируя режимы печати, запрошен-
ные пользователем. Медленные фильтры

-15-67а-

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

-15-68-

Настройка характеристик порта принтера

Вы должны быть уверены, что характеристики порта принтера,
установленные обслуживанием принтера, соответствуют установкам
коммуникации принтера. Стандартные установки порта принтера
предназначены для работы с типичными файлами UNIX и многими
принтерами, но они не работают со всеми файлами и принтерами. В
действительности это не шаг настройки, так как стандартные
средства обслуживания печати должны позволить вам задать уста-
новки порта для каждого принтера. Однако это важный шаг в обес-
печении работы принтера с обслуживанием печати, поэтому это
описывается далее более подробно.
Когда вы добавляете новый принтер, читайте документацию
для него, чтобы понимать, что он ожидает от главной системы
(обслуживания печати). Далее читайте страницу руководства для
команды stty(C) в документе User's Reference. В ней суммированы
различные характеристики, которые могут быть заданы для терми-
нала или порта принтера.
Только некоторые характеристики, перечисленные на странице
руководства stty(C), важны для принтеров. Те, которые интересны
для вас, перечислены в следующей таблице (но вы должны обра-
щаться к странице руководства stty(C) в других случаях).
Принтеры, соединенные напрямую с компьютерами, и принтеры,
соединенные через сети, требуют, чтобы характеристики порта
принтера устанавливались интерфейсной программой. Эти характе-
ристики определяют коммуникации низкого уровня с принтером. Сю-
да включена скорость передачи, использование управления потоком
XON/XOFF, 7, 8 или другое количество битов на байт, четность,
выходная постобработка. Стандартная интерфейсная программа ис-
пользует команду stty для инициализации порта принтера, мини-
мально устанавливая скорость передачи и другие характеристики
по умолчанию.
Характеристики по умолчанию, используемые стандартной ин-
терфейсной программой, перечислены ниже.
Таблица 15.8
Возможности для stty по умолчанию

По умолчанию Значение
-------------------------------------------
9600 скорость передачи 9600
cs8 8-битные байты
-cstopb 1 стоп бит на байт

-15-69-

-parenb нет генерации четности
ixon разрешено управление потоком XON/XOFF
-ixany разрешен только XON для рестарта выхода
opost поток данных постобработки как перечислено ниже?
-oluc не отображайте строчные символы в прописные
onlcr отображение подачи на одну строки в возврат
каретки/подачу на одну строку
-onlcr не отображается возврат каретки в подачу на одну
строку
-nocr выходные возвраты каретки даже с колонки 0
nl0 нет задержки после подачи на одну строку
cr0 нет задержки после возвратов кареток
tab0 нет задержки после табуляций
bs0 нет задержки после возвратов
vt0 нет задержки после вертикальных табуляций
ff0 нет задержки после переводов страницы

Вы можете обнаружить, что характеристики по умолчанию дос-
таточны для ваших принтеров. Однако принтеры сильно различают-
ся, так что может потребоваться задание различных характерис-
тик. Смотрите описание команды stty в документе User's
Reference.
Если у вас имеется принтер, которому необходимы характе-
ристики порта принтера, отличные от тех, которые обрабатываются
программой stty, вам следует настроить интерфейсную программу.
Когда вы добавляете новый принтер, вы можете определить
дополнительный список характеристик порта, который будет ис-
пользоваться при печати каждого файла пользователя. Задаваемый
список будет использоваться после списка по умолчанию, так, что
у вас не будет необходимости включать в ваш список элементы по
умолчанию, которые вы не хотите изменять.
Задайте дополнительный список следующим образом:

Ъ2/usr/lib/lpadmin -p Ъ1printer-name Ъ2-o "stty='Ъ1stty-option-list'"

Ъ2 sysadmsh пользователи выбирают:
Printers-->Configure-->Parameters
(Принтеры-->Конфигурация-->Параметры)

Заметим, что двойные кавычки и одинарные кавычки необходи-
мы, если вы даете более одного элемента в

-15-69а-

stty-option-list. Если вы не включаете характеристики альтерна-
тивного порта принтера, то в таблице будет использоваться спи-
сок по умолчанию.
В качестве примера допустим, что ваш принтер будет исполь-
зоваться для печати графических данных, тогда символы подачи
строки должны быть выходными отдельно без добавления возвра-
та-каретки. Следует ввести следующую команду:

/usr/lib/lpadmin -p printer-name -o "stty=-onlcr"

Заметим, что отдельные кавычки опущены, так как в списке имеет-
ся лишь один элемент.

-15-70-

В другом примере допустим, что ваш принтер требует нечет-
ной четности для данных, которые пересылаются на него. Следует
ввести следующую команду:

Ъ2/usr/lib/lpadmin -p Ъ1printer-name -o "stty='parenb parodd cs7'"

Настройка базы данных terminfo

Обслуживание печати основывается на стандартном интерфейсе
и базе данных terminfo при инициализации каждого принтера и ус-
тановке выбранного размера страницы, шага символов, шага строки
и набора символов. Таким образом, обычно достаточно иметь кор-
ректный элемент в базе данных terminfo для добавления нового
принтера для обслуживания принтера. Несколько элементов для
распространенных принтеров содержатся в элементах базы данных
terminfo с пакетом обслуживания печати.
Каждый принтер идентифицируется в базе данных terminfo ко-
ротким именем. Этот вид имени идентичен виду имени, используе-
мому для установки переменной оболочки TERM, например, AT&T мо-
дели 455 идентифицируется именем.
Если вы не можете найти элемент terminfo для вашего прин-
тера: вам следует добавить его. Если вы не сделаете это, вы мо-
жете еще использовать принтер с обслуживанием печати, но вы не
можете получить автоматический выбор размера страниц, шага и
набора символов и у вас могут возникнуть проблемы при отслежи-
вании набора принтеров в корректных режимах для каждого запроса
печати. Другая возможность, которую можно использовать вместо
обновления элемента terminfo, состоит в настройке интерфейсной
программы, используемой с принтером. Смотрите следующий раздел
для получения сведений о том, как это делать.
Имеются сотни элементов, которые могут быть определены для
каждого терминала или принтера в базе данных terminfo. Однако
обслуживание печати использует менее половины из них, а боль-
шинству принтеров необходимо даже меньшее количество. В таблице
15.9 перечислены элементы, которые необходимо определить (как
подходящие для принтера) для добавления нового принтера к обс-
луживанию печати.

-15-71-

Таблица 15.9

Определение terminfo
Элемент terminfo
-------------------------------------------
Булевские
значения

daisy принтер требует, чтобы оператор изменил набор
символов
Числа

bufsz число байтов, буферизуемых перед печатью
cols число колонок в строке
it метки табуляции начально располагаются через
каждый промежуток # пробелов
lines число строк на странице
orc горизонтальное разрешение в единицах на символ
orhi горизонтальное разрешение в единицах на дюйм
orl вертикальное разрешение в единицах на символ
orvi вертикальное разрешение в единицах на дюйм
cps средняя скорость печати в символах в секунду

Строки:

cr возврат каретки
cpi изменение числа символов на дюйм
lpi изменение числа строк на дюйм
chr изменение горизонтального разрешения
cvr изменение вертикального разрешения
csmn список имен набора символов
mgs сброс всех полей (верх, низ и края)
hpa абсолютная горизонтальная позиция
cud1 ниже на одну строку
cuf1 каретка справа
swidm разрешение печати двойной ширины
rwidm отмена печати двойной ширины
ff выдача страницы
is1 строка инициализации принтера
is2 строка инициализации принтера
is3 строка инициализации принтера
if имя файла инициализации

-15-71а-

iprog имя пути программы инициализации
cud пересылка каретки ниже на # строк
cuf пересылка каретки вправо на # столбцов
rep повторение символа # раз
vpa абсолютная вертикальная позиция

-15-72

scs выбор набора символов
smgb задание нижнего поля текущей строки
smgbp задание нижнего поля
smgl задание левого поля для текущей колонки
smglp задание левого поля
smgr задание правого поля для текущей колонки
smgrp задание правого поля
smgt задание верхнего поля текущей строки
smgtp задание верхнего поля
scsd начало определения набора символов
ht символ табуляции для следующего 8-символьного
прекращения табуляции

Обратитесь к странице руководства для получения подробной
информации о структуре файла terminfo(M) в документе User's
Reference и о создании элемента база данных terminfo для нового
принтера.
После того, как вы создали новый элемент, вам нужно компи-
лировать его в новой базе данных с помощью программы tic. Вве-
дите только следующую команду:

Ъ2 tic filename
filename - это имя файла, содержащего элемент terminfo, который
вы создали для нового принтера. (Эта программа имеется в Утили-
тах Информации Терминала).

Примечание
Обслуживание печати LP становиться более эффективным при ис-
пользовании кэш-информации из базы данных terminfo. Если вы
добавляете или удаляете элементы terminfo или изменяете зна-
чения, которые управляют установкой шага, шириной страницы и
длиной или наборами символов, то вам следует остановить и
рестартовать обслуживание печати так, чтобы оно смогло читать
новую информацию.

-15-73-

Как писать интерфейсную программу

Примечание
Если у вас имеется интерфейсная программа, которую вы исполь-
зуете с Утилитами Спулера LP в UNIX Система Y Издание 3.2,
она должна работать также с обслуживанием печати. Заметим,
однако, что несколько возможностей -о стандартизовано и пере-
дается каждой интерфейсной программе. Они могут взаимодейс-
твовать с аналогичным образом именованными возможностями, ко-
торые использует ваша интерфейсная программа.

Если у вас имеется принтер, который не обеспечен простым
добавлением элемента в базу данных terminfo, или же ваши пот-
ребности печати не обеспечены стандартной интерфейсной програм-
мой, вы можете использовать собственную интерфейсную программу.
Имеет смысл начать со стандартной интерфейсной программы и из-
менять ее при необходимости, чем начинать с нуля. Вы можете
найти ее копию под именем
/usr/spool/lp/model/standard.

Что делает интерфейсная программа?

Любая интерфейсная программа выполняет следующие задачи:
- Инициализирует порт принтера при необходимости. Обычная
интерфейсная программа использует для этого команду stty.
- Инициализирует физический принтер. Обычная интерфейсная
программа использует terminfo и переменную оболочки TERM
для получения управляющих последовательностей, чтобы сде-
лать это.
- Печатает страницу заголовка при необходимости.
- Печатает корректное число копий содержимого запроса.
Интерфейсная программа не отвечает за открытие порта прин-
тера. Это делается обслуживанием печати, которое обращается к
вызываемому принтеру. Соединение порта принтера дается интер-
фейсной программе, как стандартный выход, и принтер рассматри-
вается как управляющий терминал для интерфейсной программы та-
ким образом, что зависание порта приводит к посылке сигнала
SIGHUP интерфейсной программе.
Настроенная интерфейсная программа не должна завершать со-
единение принтера или любым другим способом

-15-74-

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

Как используется интерфейсная программа?

Когда обслуживание печати направляет выходной запрос на
принтер, интерфейсная программа для принтера вызывается следую-
щим образом:
Ъ2/usr/spool/lp/admins/lp/interface/P id user title copies options
file1 file2 ...

Аргументами интерфейсной программы являются:

P имя принтера
id идентификатор запроса, возвращаемый lp
user имя подключения пользователя, сделавшего запрос
title выборочный титул, заданный пользователем
copies число копий, запрошенных пользователем
options список возможностей, разделенных пробелами,
заданный пользователем, или набор обслуживания
печати
file полное имя пути печатаемого файла

Когда вызывается интерфейсная программа, ее стандартный
вход берется из /dev/null, стандартный выход направляется порту
принтера, а стандартный выход ошибок направляется в файл, пере-
даваемый пользователю, пославшему запрос печати.
Стандартный интерфейс распознает следующие значения в
списке возможностей:

nobanner Эта возможность используется, чтобы пропустить
печать страницы заголовка. Без нее страница за-
головка печатается.
nofilebreak Эта возможность используется для пропуска раз-
бивки страниц между отдельными файлами данных,
без нее разбивка делается между каждым файлом в
содержимом запроса печати.
cpi=decimal-number1 - десятичное число
lpi=decimal-number2 - десятичное число

-15-75-

Эти возможности запрашивают печать с decimal-number1
числом колонок на дюйм и с decimal-number2 числом
строк на дюйм соответственно. Стандартная интерфейс-
ная программа выделяет из базы данных terminfo управ-
ляющие последовательности, необходимые для инициали-
зации принтера по обработке шага символа и строки.
Слова pica, elite и compress - это допустимые замены
для decimal-number1 и являются синонимами для 10
столбцов на дюйм, 12 столбцов на дюйм и такого числа
колонок на дюйм, которое возможно.
Ъ2length=decimal-number1
Ъ2width=decimal-number2
Эти возможности задают длину и ширину, соответствен-
но, печатаемых страниц. Стандартная интерфейсная
программа извлекает из базы данных terminfo управляю-
щие последовательности, необходимые для инициализации
принтера по обработке длины страницы и ширины страни-
цы.
Ъ2stty='stty-option-list'

    stty-option-list

- используется после списка по умолча-
нию как аргументы в команде stty. Список по умолчанию
используется для задания конфигурации порта по умол-
чанию, дополнительный список, передаваемый интерфейс-
ной программе по умолчанию, используется для измене-
ния конфигурации при необходимости.
Указанные выше возможности задаются либо пользователем при
выдаче запроса порта, либо обслуживанием печати из значений
умолчания, устанавливаемых администратором для принтера (cpi,
lpi, length, width, stty) или для препринтной формы, используе-
мой в запросе (cpi, lpi, length, width).
Дополнительная информация о конфигурации принтера переда-
ется интерфейсной программе в переменных оболочки:
Ъ2 TERM=printer-type
Эта переменная оболочки задает тип принтера. Значение
используется как ключ для получения информации о воз-
можностях принтера из расширенной базы данных
terminfo.
Ъ2 FILTER='pipeline'
(конвейер)
Эта переменная оболочки задает использование фильтра
для посылки содержимого запроса на принтер, фильтру
передается управление принтером.

-15-76-

Ъ2 CHARSET=character-set
(набор символов)
Эта переменная оболочки задает набор символов, ис-
пользуемых при печати содержимого запроса печати.
Стандартная интерфейсная программа извлекает из базы
данных terminfo управляющие последовательности, необ-
ходимые для выбора набора символов.
Настроенная интерфейсная программа должна либо игнориро-
вать эти возможности и переменные оболочки, либо должна распоз-
навать их и соответствующим образом обрабатывать.

Настройка интерфейсной программы

Вы хотите убедиться, что настроенная интерфейсная програм-
ма задает корректные режимы stty (характеристики терминала, та-
кие как скорость передачи или выходные параметры). Стандартная
интерфейсная программа делает это, и вы можете следовать соот-
ветствующим образом. Смотрите раздел, который начинается с ком-
ментария оболочки:

## Initialize the printer port
(инициализируйте порт принтера)

Следуйте коду, используемому в стандартной интерфейсной
программе. Она устанавливает режимы по умолчанию и настроенные
режимы, заданные обслуживанием печати или пользователем в стро-
ке, аналогичной следующей:

Ъ2 stty Ъ1mode options 0<&1
(режим возможности)

Эта строка команды берет стандартный вход для команды
stty из порта принтера. Пример строки команды stty, которая за-
дает скорость передачи 1200 и устанавливает некоторые режимы
возможностей, показан далее:

stty -parenb -parodd 1200 cs8 cread clocal ixon 0<&1

Одной из характеристик порта, не устанавливаемой стандарт-
ной интерфейсной программой, является управление потоком аппа-
ратуры. Код для стандартной интерфейсной программы предполага-
ет, где эта и другие характеристики порта принтера

-15-76а-

могут быть установлены. Смотрите раздел, который начинается
комментарием оболочки:

# Here you may want to add other port initialization code
(Здесь вы можете захотеть добавить другой код инициализации
порта).

Поскольку различные принтеры имеют разное число столбцов,
убедитесь, что заголовок и "хвост" для каждой интерфейсной
программы соответствуют вашему принтеру. Стандартная интерфейс-
ная программа печатает заголовок, который соответствует
80-столбцовой странице (кроме заголовка пользователя, который
может быть длиннее). Смотрите раздел в коде для стандартной ин-
терфейсной программы, начинающийся с комментария оболочки

-15-77-

## Print the banner page
(печатайте страницу заголовка)

Настроенная интерфейсная программа должна печатать любые
сообщения об ошибках, связанные с пользователем, на стандартном
выходе или на стандартном выводе ошибок. Сообщения, посланные
на стандартный вывод ошибок, направляются электронной почтой
пользователю, сообщения, печатаемые на стандартном выходе, за-
канчиваются на напечатанной странице, где они могут читаться
пользователем, когда он выбирает выход.
После завершения печати ваша интерфейсная программа должна
завершиться с кодом, сообщающим состояние задания печати. Коды
выхода интерпретируются обслуживанием печати следующим образом:
Таблица 15.10
Коды выхода
Код Значение для обслуживания печати
-------------------------------------------
0 Запрос печати завершился успешно. Если произошел сбой
принтера, он сбрасывается.
1-127 Возникла проблема при печати данного отдельного зап-
роса (например, слишком много непечатаемых символов
или запрос превышает возможности принтера). Эта проб-
лема не влияет на последующие запросы печати. Обслу-
живание печати извещает лицо, пославшее запрос о воз-
никновении ошибки печати. Если произошел сбой
принтера, он сбрасывается.
128 Резервируется для внутреннего использования обслужи-
ванием печати LP. Интерфейсные программы не должны
завершаться с этим кодом.
129 Сбой принтера произошел при печати запроса. Эта проб-
лема влияет на последующие запросы печати. Если восс-
тановление при сбоях принтера заставляет обслуживание
печати ждать администратора для регистрации проблемы,
оно закрывает принтер. Если восстановление при сбое
продолжает печать, обслуживание печати не закрывает
принтер, но пытается печатать снова через несколько
минут.
>129 Эти коды резервируются для внутреннего использования
обслуживанием печати. Интерфейсные программы не долж-
ны завершаться с кодами в этом диапазоне.
Как показывает таблица одним из способов извещения
администратора о сбое принтера является завершение с кодом 129.

-15-78-

К сожалению, если интерфейсная программа завершается, обслужи-
вание печати не имеет другого выбора, кроме перепечатки запроса
с начала, когда сбой сбрасывается. Другим способом получения
предупреждения администратором, но без необходимости перепечат-
ки всего запроса, является посылка интерфейсной программой со-
общения о сбое обслуживанию печати, но с ожиданием сброса сбоя.
После сброса сбоя интерфейсная программа может возобновить пе-
чать файла пользователя. После завершения печати она может вы-
дать нулевой код выхода таким образом, как будто сбой не проис-
ходил. Дополнительное достоинство состоит в том, что
интерфейсная программа может регистрировать регистрацию сбоя
автоматически, так, что администратор не должен открывать прин-
тер.
Сообщения о сбое могут посылаться обслуживанию печати с
помощью программы lp.tell. Ссылки осуществляются переменной
оболочки $LPTELL в стандартном интерфейсном коде. Эта программа
берет стандартный вход и посылает его обслуживанию печати, где
он помещается в сообщение, которое предупреждает администратора
о сбое принтера. Если стандартный вход принтера пуст, lp.tell
не инициирует предупреждение. Проверим стандартный интерфейсный
код сразу после этих комментариев для примера того, как исполь-
зуется программа lp.tell ($LPTELL):

# Here's where we set up the $LPTELL program to capture
# fault messages.
# Here's where we print the file.
(далее мы запрашивает у программы $LPTELL перехват сообщений о
сбое. Далее мы печатаем файл).

Для специального кода выхода 129 или программы lp.tell от-
сутствует необходимость для интерфейсной программы закрывать
сам принтер. Ваша интерфейсная программа может закрыть принтер
напрямую, но при этом перекрывается механизм предупреждения о
сбоях. Предупреждения посылаются только, если обслуживание пе-
чати регистрирует сбойный принтер, а специальный код выхода
программа lp.tell - это основные инструменты регистрации.

-15-78а-

Если обслуживание печати должно прервать печать файла в
любое время, оно отменяет интерфейсную программу с сигналом 15
(смотрите kill(C) в документе User's Reference и signal(S) в
документе Programmer's Referense). Если интерфейсная программа
отменяется при получении любого другого сигнала, то обслужива-
ние печати предполагает, что последующие запросы печати не под-
вержены влиянию и продолжают использовать принтер. Обслужи-
вание печати извещает лицо, получившее запрос, о том, что он не
завершился успешно.
Запуск сигналов SIGHUP, SIGINT, SIGOUT, SIGPIPE (обращения
номер 1, 2, 3 и 13) игнорируется, когда вызывается интерфейс.
Стандартный интерфейс проводит изменения для перехвата этих
сигналов в соответствующие моменты. Стандартный интерфейс расс-
матривает получение этих сигналов как то, что у принтера воз-
никла проблема, и выдает извещение о сбое. Это та программа,
которую обслуживание печати использует для управления принтером
каждый раз, когда печатается файл. Она выполняет четыре основ-
ные задачи:
- Инициализация порта принтера (соединение между компьюте-
ром и принтером).

-15-79-

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