Системное программирование в UNIX средствами Free Pascal

Поле с_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:


Содержание раздела