Костромин Виктор Алексеевич
Шрифт:
Для каждого задания программа lpr помещает в буферный каталог два файла: cfxxx и dfxxx, где xxx - номер текущего задания. Файл cfxxx содержит справочную информацию и информацию об обработке задания. Источником этих сведений являются командная строка запуска программы, переменные среды процесса, который запустил эту программу, и глобальная конфигурация системы. Файл dfxxx содержит данные, подлежащие печати.
После постановки задания в очередь lpr уведомляет демона lpd о появлении задания на печать. Взаимодействие lpr с lpd происходит через именованный сокет /dev/printer. Демон lpd тоже обращается к файлу /etc/printcap, чтобы узнать, какой принтер должен использоваться для печати, и является он локальным или удаленным. Если в /etc/printcap указано, что принтер подключен локально, lpd проверяет наличие демона печати, обрабатывающего соответствующую очередь. Дело в том, что для обработки каждой очереди lpd создает отдельную копию самого себя. Если такой копии еще не имеется, она создается и ей передается обработка очереди. Если соответствующий принтер подключен к другой машине, lpd устанавливает соединение с демоном lpd удаленной машины и пересылает туда файл данных и управляющий файл.
Обслуживание заданий печати осуществляется по правилу "первым пришел - первым обслужен" (FIFO). Системный администратор может при желании изменить порядок печати с помощью программы lpc.
Начиная с ядра 2.1.33 устройство lp является клиентом нового устройства parport. Введение parport решает некоторые проблемы, связанные с lp - теперь можно разделять параллельные порты с другими драйверами, динамически связывать порты с устройствами, не устанавливая жесткого соответствия между адресами I/O и номером порта и т. д. Подробнее об этом вы можете прочитать в статье [П11.11].
9.6.2. Файл /etc/printcap
Файл /etc/printcap - это главная база данных системы печати LPD. Принтер будет получать задания на печать только в том случае, если он (принтер) описан в этом файле. Поэтому для получения возможности использовать принтер вы должны добавить очередь печати к lpd, т. е. создать новый буферный подкаталог в каталоге /var/spool/lpd и добавить соответствующую запись в файл /etc/printcap.
Запись в файле /etc/printcap выглядит примерно так:
Каждый элемент файла /etc/printcap начинается со строки, задающей имена принтера (их может быть несколько), разделяемые вертикальной чертой. Затем следует ряд параметров конфигурации, разделенных двоеточиями (обычно каждый параметр заключается в двоеточия с обеих сторон). Каждый параметр имеет вид xx=строка или xx#число, где xx - двухсимвольное имя параметра, а строка и число - присваиваемые ему значения. Если никакого значения не присваивается, переменная является булевой, и ее присутствие означает "истина". Допускаются пустые операторы: два рядом стоящих двоеточия. Строки, начинающиеся символом #, содержат комментарий. Обратная косая черта в конце строки означает, что в следующей строке идет продолжение текущей строки.
Приведенный выше пример записи определяет принтер называемый lp, dj, или deskjet, его спул размещается в директории /var/spool/lpd/dj, максимальный размер задания не имеет ограничения, печать производится на устройство /dev/lp0, и страница с заголовком (с именем пользователя, который отправил задание на печать, и другой информацией) не добавляется в начало задания печати.
Подробнее о том, как создавать такие записи, можно прочитать на справочной странице для printcap. Но о некоторых самых важных (и обязательных) параметрах стоит рассказать здесь, хотя бы просто для примера.
• sd=буферный_каталог. У каждого принтера должен быть свой буферный каталог. Все буферные каталоги должны находиться в одном каталоге (обычно это /var/spool/lpd) и иметь имена, совпадающие с полными именами обслуживаемых ими принтеров. Буферный каталог нужен даже в том случае, если описываемый принтер подключен к другой машине: задания находятся на локальной машине до тех пор, пока они не будут переданы на печать.
• lp=имя_устройства. В таком виде этот параметр должен задаваться только для локального принтера. Если принтер находится на другой машине, вместо имени устройства указывается имя уникального файла, который существует и расположен на локальном диске. Чтобы принтер мог возвращать через указанный файл информацию о своем состоянии, необходимо задать в элементе булеву переменную rw, чтобы устройство было открыто и для чтения, и для записи.
• rm и rp. Во многих случаях в качестве печатающего устройства используется сетевой принтер, подключенный к какому-то другому компьютеру в локальной (или даже глобальной) сети. В таком случае на вашей машине в файле /etc/printcap должны присутствовать две переменные rm и rp. В переменной rm определяется машина, на которую должны посылаться задания, а переменная rp задает имя принтера на этой машине.
• mx. Переменная mx используется для задания максимального размера (в байтах) печатаемого файла. Этот параметр может использоваться системными администраторами для того, чтобы предотвратить отрицательные последствия распространенной ошибки начинающих пользователей, состоящей в посылке на печать двоичных файлов (которые обычно имеют большую длину). Поскольку такие файлы могут содержать произвольные символы, в том числе символы, которые служат в качестве управляющих команд для принтера, печать двоичных файлов может приводить, например, к неоправданному расходованию бумаги и другим неприятным последствиям. На локальном принтере персонального компьютера этот параметр можно и не задавать. Я привел его для того, чтобы отметить, что для этого параметра, как и для всех других числовых параметров, значение должно отделяться от имени параметра знаком #, например, mx#0. Если написать mx=0, то такая запись не вызовет сообщений об ошибке, но она не изменяет значения переменной mx.
Еще один очень существенная группа параметров - это параметры of, if и nf. Но о них надо поговорить особо, что мы и сделаем чуть ниже в подразделе "Фильтры". Однако вначале рассмотрим программу, которая позволяет осуществить настройку принтера и создать файл /etc/printcap/.
9.6.3. Настройка lpd с помощью программы printconf-gui
Настройка системы LPD состоит в том, что обеспечивается возможность создавать очереди файлов и отправлять задания из этих очередей на принтер. Такую настройку можно произвести вручную, и я надеюсь, что приведенное выше описание позволяет это сделать. Однако в большинстве дистрибутивов имеются специальные утилиты, облегчающие конфигурацию подсистемы печати. В дистрибутиве Red Hat версии 6 такая утилита называлась printtoool, а в версии 7.1 вместо printtool включена утилита printconf-gui, которую можно вызвать из меню оболочки KDE. Эта утилита поддерживает ведение конфигурационного файла /etc/printcap, создание областей спулинга и выбор фильтров. Если в файле /etc/printcap не имеется ни одной записи о принтерах, то главное окно программы printconf-gui выглядит так, как показано на рис. 9.2.