Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

Поле c_oflag

Поле с_оflag позволяет управлять режимом вывода. Наиболее важным флатом в этом поле является флаг OPOST. Если он не установлен, то выводимые символы передаются без изменений. В противном случае символы подвергаются обработке, заданной остальными флагами, устанавливаемыми в поле c_oflag. Некоторые из них вызывают подстановку символа возврата каретки (CR) при выводе на терминал:

ONLCR

Преобразовать символ возврата каретки (CR) в символ возврата каретки (CR) и символ перевода строки (NL)

OCRNL

Преобразовать символ возврата каретки (CR) в символ перевода строки (NL)

ONOCR

Не выводить символ возврата каретки (CR) в нулевом столбце

ONLRET

Символ перевода строки (NL) выполняет функцию символа возврата каретки (CR)

Если установлен флаг ONLCR, то символы перевода строки NL преобразуются в последовательность CR+NL (символ возврата каретки и символ перевода строки). Это гарантирует, что каждая строка будет начинаться с левого края экрана. И наоборот, если установлен флаг OCRNL, то символ возврат каретки будет преобразовываться в символ перевода строки. Установка флага ONLRET сообщает драйверу терминала, что для используемого терминала символы перевода строки будут автоматически выполнять и возврат каретки. Если установлен флаг ONOCR, то символ возврата каретки не будет посылаться при выводе строки нулевой длины.

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

Поле с_lflag

Возможно, наиболее интересным элементом структуры termios для программиста является поле c_lflag. Оно используется текущей дисциплиной линии связи для управления функциями терминала. Это поле содержит следующие флаги:

ICANON

Канонический построчный ввод

ISIG

Разрешить обработку прерываний

IEXTEN

Разрешить дополнительную (зависящую от реализации) обработку вводимых символов

ECHO

Разрешить отображение вводимых символов на экране

ЕСНОЕ

Отображать символ удаления как возврат-пробел-возврат

ЕСНОК

Отображать новую строку после удаления строки

ECHONL

Отображать перевод строки

NOFLSH

Отменить очистку буфера ввода после прерывания

TOSTOP

Посылать сигнал SIGTTOU при попытке вывода фонового процесса

Если установлен флаг ICANON, то включается канонический режим работы терминала. Как уже было видно выше, это позволяет использовать символы редактирования строки в процессе построчного ввода. Если флаг ICANON не установлен, то терминал находится в режиме прямого доступа (raw mode), который чаще всего используется полноэкранными программами и коммуникационными пакетами. Вызовы read будут при этом получать данные непосредственно из очереди ввода. Другими словами, основной единицей ввода будет одиночный символ, а не логическая строка. Программа при этом может считывать данные по одному символу (что обязательно для экранных редакторов) или большими блоками фиксированного размера (что удобно для коммуникационных программ). Но для того чтобы полностью управлять поведением вызова fdread, программист должен задать еще два дополнительных параметра. Это параметр VMIN, наименьшее число символов, которые должны быть приняты до возврата из вызова read, и параметр VTIME, максимальное время ожидания для вызова fdread. Оба параметра записываются в массиве с_сс. Это важная тема, которая будет подробно изучена в следующем разделе. А пока просто обратим внимание на то, как в следующем примере сбрасывается флаг ICANON.

uses stdio, linux;

var

tdes:termios;

.

.

.

tcgetattr(0, tdes);

tdes.c_lflag := tdes.c_lflag and (not ICANON);

tcsetattr(0, TCSAFLUSH, tdes);

Если установлен флаг ISIG, то разрешается обработка клавиш прерывания (intr) и аварийного завершения (quit). Обычно это позволяет пользователю завершить выполнение программы. Если флаг ISIG не установлен, то проверка не выполняется, и символы intr и quit передаются программе без изменений.

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

Если одновременно установлены флаги ЕСНОЕ и ECHO, то символ удаления будет отображаться как последовательность символов backspace-space-backspace (возврат–пробел–возврат). При этом последний символ на терминале немедленно стирается с экрана, и пользователь видит, что символ действительно был удален. Если флаг ЕСНОЕ установлен, а флаг ECHO нет, то символ удаления будет отображаться как space-backspace, тогда при его вводе будет удаляться символ в позиции курсора алфавитно-цифрового терминала.

Если установлен флаг ECHONL, то перевод строки будет всегда отображать на экране, даже если отображение символов отключено, что может быть полезным при выполнении самим терминалом локального отображения вводима символов. Такой режим часто называется полудуплексным режимом (half-duplex mode).

Последним флагом, заслуживающим внимания в этой группе флагов, является флаг NOFLSH, который подавляет обычную очистку очередей ввода и вывод при нажатии клавиш intr и quit и очистку очереди ввода при нажатии клавиши susp.

Альтернативой TCGetAttr может быть вызов IOCtl:

uses Linux;

var

tios : Termios;

begin

IOCtl(1,TCGETS,@tios);

WriteLn('Input Flags : $',hexstr(tios.c_iflag,8));

WriteLn('Output Flags : $',hexstr(tios.c_oflag,8));

WriteLn('Line Flags : $',hexstr(tios.c_lflag,8));

WriteLn('Control Flags: $',hexstr(tios.c_cflag,8));

end.

Для удобства изменения параметров терминала в файле linux определена функция CFMakeRaw:

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal