Поток данных буферизации (команда enq)
Команды lp, lpr, qprt и enq предназначены для передачи задания на выполнение программе буферизации AIX.
Фактической точкой входа для программы буферизации является команда enq; команды lp, lpr и qprt анализируют свои аргументы, а затем вызывают enq. Для того чтобы посмотреть, как работает эта схема, войдите в систему под именем root и с помощью командной строки выполните следующие действия:
- Введите
mount /bin/echo /bin/enq. - Введите
qprt -Pasc -fp -z1 -p12 -s courier -C -N 3 /etc/motd. - Введите
umount /bin/enq.
Команда qprt, вызываемая на шаге 2, передает задание печати программе буферизации и помещает его в очередь asc, запрашивая при этом три копии "ежедневного приветствия", набранные шрифтом Courier размером 12 пунктов с поворотом на 90 градусов. Команда qprt анализирует аргументы командной строки и формирует новый набор аргументов для передачи команде enq. Когда qprt вызывает enq и передает ей этот набор аргументов, на самом деле вызывается команда echo, смонтированная вместо команды enq. Таким образом, строка аргументов, сформированная командой qprt, передается команде echo, которая выводит эту строку на экран. Аналогично можно выполнить эту процедуру для команд lp и lpr. Этот метод не только демонстрирует, что команда qprt является клиентом команды enq, но и помогает выяснить, как передать программе буферизации неподдерживаемые флаги. Дополнительная информация приведена в разделе Фильтры.
Выполнение команды qprt на шаге 2 приводит к выводу следующей строки на экран дисплея, заданного с помощью переменной среды TERM:
-P asc -o -o -f -o p -z -o 1 -o -p -o 12 -o -s courier -C -N 3 /etc/motdЭто строка аргументов, сформированная командой qprt. Если бы вместо enq не была смонтирована команда echo, то была бы запущена следующая команда передачи задания на выполнение:
enq -P asc -o -f -o p -o -z -o 1 -o -p -o 12 -o -s courier -C -N 3 /etc/motdКоманда, передающая задание на выполнение, должна оканчиваться именем одного или нескольких файлов, реально существующих в файловой системе и доступных для базовой операционной системы. Это верно не только для заданий печати, но и для заданий других типов.
При выполнении команды enq, непосредственно или с помощью команд lp, lpr или qprt, заданию присваивается номер. По умолчанию команда lp возвращает номер задания. Команды lpr и qprt не возвращают номер задания, если не указан специальный флаг.
Команда enq создает JDF в каталоге /var/spool/lpd/qdir, помещает имя JDF в очередь сообщений и передает сигнал (SIGUSR2) о появлении нового JDF программе qdaemon. Затем программа qdaemon считывает имя JDF из очереди сообщений, получает непосредственный доступ к JDF, считывает содержащиеся в нем данные и помещает их во внутреннюю структуру, предназначенную для отслеживания текущих заданий программы буферизации. С этого момента задание считается принятым программой буферизации.
JDF создается для всех системных операций буферизации, кроме запроса о состоянии очереди; структура JDF зависит от типа запроса (запрос на печать, запрос на отмену задания, запрос на управление очередью и т.д.), но JDF создается всегда. Команды, выполняющие ту же функцию, что и lpstat, также обращаются к enq, но при этом JDF не создается и qdaemon не вызывается.
После того как программа qdaemon определяет, что устройство, к которому относится данное задание, доступно, она вызывает базовую программу для соответствующей очереди и передает ей аргументы, указанные в JDF. Базовая программа выполняет задание.