7.12.1. Как LP обрабатывает
файл запроса.
7.12.2. Настройка
характеристик порта принтера
7.12.3. Настройка базы
данных Terminfo
7.12.4. Как написать
программу интерфейса
7.12.5. Как использовать
программу интерфейса
7.12.6. Настройка программы
интерфейса
Хотя LP отвечает большей части требований к распечатке, существуют принтеры, которые не совсем соответствуют способу обработки принтеров сервисом LP.
Вы можете оосуществить настройку LP несколькими способами. В этом подразделе рассказывается как вы можете:
Каждый запрос отсылается в spooling daemon, который следит за всеми запросами. Следящий процесс (демон) создается, когда вы запускаете сервис принтера LP. Этот процесс системы UNIX также отвечает за слежением за состоянием принтеров и медленных фильтров; когда принтер заканчивает распечатку файла пользователя, демон запустит на нем распечатку другого запроса, если он есть в очереди.
Вы можете настроить сервис принтера, если настроите или замените некоторые из элементов процесса.
Вам следует удостовериться, что характеристики порта принтера, установленные LP, согласуются с установками линии связи принтера. Стандартные установки порта были созданы для работы с типичными файлами системы UNIX и многими принтерами, но они не будут работать со всеми файлами и принтерами. Это не является шагом настройки, т.к. стандартным свойством LP является предоставление вам возможности указать установки порта для каждого принтера. Однако, это является важным шагом в подготовке вашего принтера к работе с LP.
Когда вы добавляете новый принтер, прочтите документацию к нему, чтобы иметь представление о том, что он ожидает от главной машины. Затем изучите команду stty. Она сводит воедино различные характеристики, которые невозможно установить на терминале или в порт принтера.
В табл. 2 перечислены параметры команды stty, которые имеют значение для принтеров.
Таблица 2
Параметр stty | Значение |
---|---|
evenp | Отсылает проверку на четность в 8-м разряде |
oddp | Отсылает проверку на нечетность в 8-м разряде |
-parity | Не формирует разряда четности, посылает все 8 разрядов без изменений |
110 - 38400 | Устанавливает скорость в линии передачи на эту скорость передачи |
ixon | Разрешает управление потоками XON/XOFF (также известное как START/STOP или DC1/DC3) |
-ixon | Отключает управление потоками XON/XOFF |
-opost | Не выполняет "постобработку вывода" |
opost | Выполняет "постобработку вывода" согласно установкам |
onclr | Вставляет символ "возврат каретки" перед любым символом "перевод строки" |
-onclr | Не вставляет символ "возврат каретки" |
ocrnl | Изменяет символ "возврат каретки" на символ "перевод строки" |
-ocrnl | Не изменяет символ "возврат каретки" на символ "перевод строки" |
-tabs | Заменяет метки табуляции на эквивалентное число пробелов |
tabs | Не заменяет метки табуляции на пробелы |
LP полагается на страндартный интерфейс и базу данных Terminfo при иницииации каждого принтера и установке выбранного размера страницы, шага расположения символов, шага строки и набора символов. Обычно бывает достаточно сделать правильный ввод элементов в базу данных Terminfo, чтобы добавить новый элемент к LP . Несколько элементов принтеров AT&T поставляются вместе с элементами Treminfo в пакете LP.
Каждый принтер идентифицируется в базе данных Terminfo по короткому имени; этот вид имени идентичен тому, которое используется для установки пременной командного файла TERM. Например, принтер AT&T модель 455 идентифицируется по имени 455.
Если вы не можете найти элемент Terminfo для вашего принтера, вам надо его добавить. Если вы этого не сделаете, вы сможете использовать принтер с LP, но у вас не будет возможности получать автоматический выбор размера страницы, шага и набора символов, и у вас могут возникать трудности с установкой принтера в правильные режимы для каждого запроса на распечатку. Другим вариантом, которым можно воспользоваться вместо обновления элемента Terminfo, это настроить программу интерфейса, используемую с принтером.
В табл. 3 пречислены элементы, которые нужно определить, прежде чем добавить новый принтер в базу Terminfo.
Таблица 3
Элемент Terminfo | Значение |
---|---|
daisy | Принтеру нужен оператор, чтобы изменить набор символов |
bufsz | Число байтов, помещаемых в буфер перед распечаткой |
* cols | Число колонок в строке |
* it | Метки табуляции, используемые вместо пробелов |
* lines | Число строк на странице |
orc | Разрешающая способность по горизонтали в единицах на символ |
orchi | Разрешающая способность по горизонтали в единицах на дюйм |
orl | Разрешающая способность по вертикали в единицах на символ |
orvi | Разрешающая способность по вертикали в единицах на дюйм |
cps | Средняя скорость распечатки в символах |
* cr | Возврат каретки |
cpi | Изменение числа символов на дюйм |
lpi | Изменение числа строк на дюйм |
chr | Изменение разрешающей способности по горизонтали |
cvr | Изменение разрешающей способности по вертикали |
csnm | Список имен набора символов |
mgс | Очистка всех полей (верхних, нижних и боковых) |
* hpa | Абсолютная позиция по горизонтали |
* cud1 | На одну строку вниз |
* cuf1 | Каретку вправо |
swidm | Разрешение печати удвоенной ширины |
rwidm | Запрещение печати удвоенной ширины |
* ff | Выдача страницы |
* is1 | Строка инициации принтера |
* is2 | Строка инициации принтера |
* is3 | Строка инициации принтера |
* if | Имя файла инициации |
* iprog | Полное имя программы инициации |
* cud | Перемещение кареткии на # строки вниз |
* cuf | Перемещение кареткии на # строки вправо |
* rep | Повтор символа # раз |
* vpa | Абсолютная позиция по вертикали |
scs | Выбор набора символов |
smgb | Установка нижних полей на текущей строке |
smgbp | Установка нижних полей |
smgl | Установка левых полей в текущей колонке |
smglp | Установка полей слева |
smgr | Установка правых полей в текущей колонке |
smgrp | Установка полей справа |
smgt | Установка верхних полей на текущей строке |
smgtp | Установка верхних полей |
scsd | Запуск определения набора символов |
* ht | Метка табуляции для следующих 8 пробелов |
Те элементы, которые помечены звездочкой (*), имеются во всех версиях UNIX System V. Остальные можно добавить только, если вы используете систему UNIX System V версии 3.2 или более поздние.
После того как вы создали новый элемент, вам нужно скомпилировать его в базу данных, используя программу tic. Просто введите следующую команду:
tic filename
где filename - это имя файла, содержащего элемент Terminfo для нового принтера.
Примечание. Сервис принтера LP работает наиболее эффективно, если кэширует информацию из базы данных Terminfo. Если вы добавляете или удаляете элементы из Terminfo или изменяете значения, управляющие установками шагов, шириной и длиной страницы вам следует перезапустить LP, чтобы он использовал новую информацию.
Если у вас есть требования к печати, которые не поддерживаются стандартной программой интерфейса, вы можете создать свою собственную программу интерфейса, взяв стандартную программу и настроив ее в соответствии со своими требованиями. Копия программы находится в файле: /usr/lib/lp/model/standard
Любая программа интерфейса выполняет следующие действия:
Программа интерфейса отвечает за открытие порта принтера. Это выполняется с помощью LP, который носит название коммутируемого принтера, если так устанавливается линия связи с принтером. Соединение порта принтера задается программе интерфейса как стандартный вывод, и принтер устанавливается как управляющий терминал для программы интерфейса и тогда "зависание" порта даст сигнал SIGHUP, который должен отсылаться в программу интерфейса. Настроенная программа интерфейса не должна прекращать инициацию принтера, что позволяет LP использовать программу интерфейса только для подготовки принтера или порта принтера, а распечатка выполняется как-нибудь иначе.
Программа интерфейса вызывается следующим образом:
/usr/sbin/lp/admins/lp/interface/P id user title copies \ options file1 file2 ...
где P - имя принтера;
id - идентификатор запроса,
взвращаемый LP;
user - регистрационный номер
пользователя, делающего запрос;
title - необязательный заголовок,
указываемый пользователем;
copies - количество запрошенных копий;
options - список параметров;
file - полное имя распечатываемого
файла.
Когда вызывается программа интерфейса, ее стандартный ввод идет из /dev/null, стандартный вывод направляется в порт принтера, а стандартный вывод ошибок направляется в файл, который задается пользователем, выдающим запрос на распечатку.
Параметр options cтандартной программы интерфейса может принимать следующий значения:
Дополнительная информация о конфигурации принтера передается программе интерфейса в переменных командного файла:
Настроенная программа интерфейса или должна игнорировать эти параметры и переменные командного файла, или распознавать их и обрабатывать соответствующим образом.
Вы хотите убедиться, что настроенная программа интерфейса устанавливает требуемые режимы stty (характеристики терминала, такие как скорость передачи или параметры вывода). Стандартная программа интерфейса делает это, и вы можете последовать этому примеру. Найдите часть, которая начинается с комментария командного файла:
## Initialize the printer port
Выполняйте код, используемый стандартной программой интерфейса. Он устанавливает как режимы по умолчанию, так и настраиваемые режимы, задаваемые с помощью LP или пользователем строкой следующего вида:
stty mode options 0<&1
Эта командная строка обрабатывает стандартный ввод для команды stty из порта принтера. Пример строки команды stty, которая устанавливает скорость передачи на 1200 и устанавливает некоторые необязательные режимы:
stty -parenb -parodd 1200 cs8 cread clocal ixon 0<&1
Одна из характеристик, не устанавливаемая стандартной программой интерфейса - управление потоками аппаратных средств. Способ ее установки будет различен в зависимости от аппаратных средств вашего компьютера. Найдите часть, которая начинается с комментария командного файла:
# Here you may want to add other port # initialization code
Вследствии того, что различные принтеры имеют разное число колонок, убедитесь, что заголовок и концевик для вашей программы интерфейса соответствуют вашему принтеру. Стандартная программа интерфейса распечатывает заглавную страницу, которая сооветствует 80-колоночной странице (за исключением "шапки" пользователя, которая может быть длиннее). Найдите часть в тексте стандартной программы интерфейса, которая начинается с комментария:
## Print the banner page
Некоторые прикладные приложения программы, функционирующие с конкретными принтерами, могут потребовать отключения прерывания страницы. Если вы должны отключить прерывание страницы, вы можете модифицировать стандартную программу интерфейса (/usr/lib/lp/model/standard) на строке 192, изменив "no" на "yes".
Настроенная программа интерфейса должна распечатывать все сообщения об ошибках, связанных с пользователем, в стандартном выводе или в стандартном выводе ошибок. Сообщения, отосланные в стандартный файл ошибок, будут переданы пользователю почтой; сообщения, направленные в стандартный вывод, будут стоять в конце страницы, откуда они могут быть считаны пользователем, когда он получит вывод.
После завершения распечатки ваша программа интерфейса должна выйти с кодом, который сообщает о состоянии выполнения заданий по распечатке. Этот код интерпретируется сервисом LP следующим образом:
Код | Значение для LP |
---|---|
0 | Запрос выполнен успешно. Если был сбой принтера, он утранен |
1 до 127 | Возникла проблема с распечаткой этого конкретного запроса (например, слишком много нераспечатываемых символов или запрос превышает возможности принтера). Эта проблема не повлияет на будущие запросы. LP уведомляет того, кто выдал этот запрос, при его распечатке. Если возник сбой принтера, он устранен |
128 | Зарезервирован для внутреннего использования севисом LP |
129 | При распечатке запроса возник сбой принтера. Это повлияет на будущие запросы. Если механизм восстановления после сбоя даст указание LP подождать решения проблемы администратором, он запретит использование принтера |
более 129 | Зарезервировано для внутреннего использования сервисом LP |
Как показывает эта таблица, одним из способов извещения администратора о сбое принтера является возврат кода 129 программой интерфейса. После устранения сбоя LP вновь распечатывает запрос с самого начала. Способом получения информации о сбое без повторной распечатки всего запроса является отсылка программой интерфейса сообщения сервису LP и ожидание его устранения. После устранения сбоя программа интерфейса может возобновить распечатку файла пользователя. После окончания распечатки программа интерфейса может возвратить нулевой код, будто бы сбоя и не возникало.
Сообщения о сбоях можно отослать LP с помощью программы lp.tell. Для обращения к этой программе в стандартной программе интерфейса используется переменная командного файла $LPTELL. Программа обрабатывает свой стандартный ввод и отсылает его LP, где он помещается в сообщение, предупреждающее администратора о сбое принтера. Если стандартный ввод пуст, lp.tell не инициирует предупреждение. Проверьте код стандартной программы интерфейса после комментариев:
# Here's where we set up the $LPTELL programm # to capture fault messages. # Here's where we print the file.
При использовании специального кода возврата 129 или программы lp.tell, уже нет необходимости программе интерфейса запрещать сам принтер. Ваша программа может запретить принтер прямо, но это отменит механизм предупреждения о сбоях. Они отсылаются только, если LP выявляет, что принтер дал сбой, а специальный код и программа lp.tell являются главными инструментами его выявления.
Если LP нужно прервать распечатку файла в какой-то момент, он остановит программу интерфейса сигналом 15. Если программа интерфейса останавливается при получении любого другого сигнала, LP предполагает, что будущие запросы не будут подвергнуты влиянию и будет продолжать использовать принтер. LP уведомит того, кто выдал запрос на распечатку, что запрос завершен неуспешно.
Назад | Содержание | Вперед