Опубликован: 12.11.2008 | Доступ: свободный | Студентов: 3593 / 357 | Оценка: 4.31 / 4.35 | Длительность: 19:07:00
Лекция 7:

Использование принтеров

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

Если у вас есть требования к печати, которые не поддерживаются стандартной программой интерфейса, вы можете создать свою собственную программу интерфейса, взяв стандартную программу и настроив ее в соответствии со своими требованиями. Копия программы находится в файле: /usr/lib/lp/model/standard

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

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

  • инициирует порт принтера при необходимости, используя команду stty ;
  • инициирует физический принтер. Программа интерфейса использует Terminfo и переменную командного файла TERM, чтобы получить управляющие последовательности для выполнения этой задачи;
  • при необходимости распечатывает заглавную страницу;
  • распечатывает правильное количество копий содержимого запроса.

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

7.12.5. Как использовать программу интерфейса

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

/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тандартной программы интерфейса может принимать следующий значения:

  • nobanner - используется, чтобыпропуститьзаглавнную страницу;
  • nofilebreak - используется, чтобы пропустить прерывание страницы между отдельнными файлами данных;
  • lpi=decimal-number2 - устанавливают параметры распечатки: "decimal-number1" колонок на дюйм и "decimal-number2" строк на дюйм соответственно. Слова pica, elite и compressed являются приемлемыми заменами decimal-number1 и означают 10 колонок на дюйм, 12 колонок на дюйм и максимально возможное число колонок на дюйм соответственно;
  • width=decimal-number2 - устанавливают соответственно длину и ширину страниц для распечатки;
  • 'stty-option-list' - используется для изменения конфигурации порта, которая устанавливается по умолчанию.

Дополнительная информация о конфигурации принтера передается программе интерфейса в переменных командного файла:

  • TERM=printer-type - указывает тип принтера. Это значение используется для получения информации о возможностях принтера из базы данной Terminfo ;
  • FILTER='pipeline' - указывает фильтр, используемый для отсылки содержимого запроса на принтер;
  • CHARSET=character-set - указывает набор символов, используемый при распечатке содержимого запроса.

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

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

Вы хотите убедиться, что настроенная программа интерфейса устанавливает требуемые режимы 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 уведомит того, кто выдал запрос на распечатку, что запрос завершен неуспешно.