Управление терминалом (1114938), страница 2
Текст из файла (страница 2)
Адрес структуры, в которую будет записана информация, должен содержаться в параметре termios_p. При успешном завершении функциявозвращает 0, а при ошибке — -1. Переменная errno может содержать следующие кодыошибок:EBADFАргумент fd не является допустимым файловым дескриптором.ENOTTY Файловый дескриптор fd не ассоциирован с терминалом.Функция tcsetattr устанавливает атрибуты терминала, ассоциированного с файловым дескриптором fd. Адрес структуры, содержащей новые атрибуты терминала, передаётся в параметре termios_p.
Параметр action указывает, как нужно поступить с входнымии выходными символами, находящимися в очередях терминала. Он может принимать следующие значения:3TCSANOWИзменения вступят в силу немедленно.TCSADRAIN Изменения вступят в силу после того, как все символы в выходной очереди терминала будут переданы на терминал. Этот флаг должен использоваться, когда устанавливаются режимы работы, затрагивающие вывод натерминал.TCSAFLUSH Аналогично TCSADRAIN, но дополнительно сбрасывает очередь ввода стерминала.Функция tcdrain приостанавливает выполнение процесса до тех пор, пока все символыиз выходной очереди терминала, ассоциированного с файловым дескриптором fd, не будутпереданы на терминал.Функция tcflush сбрасывает данные из очередей терминала, ассоциированного с файловым дескриптором fd. Параметр queue может принимать следующие значения:TCIFLUSHСбрасывает входную очередь терминала.TCOFLUSHСбрасывает выходную очередь терминала.TCIOFLUSH Сбрасывает и входную, и выходную очереди терминала.Функция tcflow приостанавливает приём данных с терминала или передачу данных натерминал в зависимости от значения параметра action.TCOOFF Приостанавливает вывод на терминал.TCOONВозобновляет вывод на терминал.TCIOFF Передаёт на терминал символ STOP, который вызывает приостановку передачи вводимых символов от терминала к системе.TCIONПередаёт на терминал символ START, который возобновляет передачу вводимых символов от терминала к системе.1.3.1 Режимы ввода с терминалаВ этом разделе рассматриваются флаги, управляющие относительно низкоуровневыми деталями обработки ввода с терминала: обработка ошибок чётности, сигналы прерывания, управление потоком данных и т.
д. Все эти флаги — биты в поле c_iflag структурыstruct termios. Это поле имеет один из целых типов, поэтому флаги можно модифицировать побитовыми операциями &, |, ^. Никогда не задавайте значение c_iflag целиком,изменяйте только нужные флаги, а остальные биты не трогайте.ISTRIP Если этот бит установлен, у всех входных байтов обнуляется старший бит.IGNBRK Если установлен этот бит, сигнал прерывания игнорируется.
Сигнал прерывания в асинхронной последовательной передаче данных определяется какпоследовательность нулевых бит длины, большей чем байт.BRKINT Если этот бит установлен, а бит IGNBRK сброшен, сигнал прерывания сбрасывает входную и выходную очереди терминала и генерирует сигнал SIGINTдля основной группы процессов, связанной с этим терминалом. В противномслучае сигнал прерывания передаётся в программу как символ ’\0’.IGNCRЕсли установлен этот бит, символы возврата каретки (’\r’) при вводе игнорируются.ICRNLЕсли установлен этот бит, а IGNCR сброшен, символы возврата каретки(’\r’) передаются в программу как символы перевода строки ’\n’.INLCRЕсли установлен этот бит, символы перевода строки передаются в программукак символы возврата каретки.4IXOFFIXONЕсли этот бит установлен, управление приостановкой/продолжением передачи на входном потоке включено.
Другими словами, компьютер посылает символы START и STOP, когда необходимо предотвратить переполнениевходной очереди терминала. Оборудование терминала должно приостановить посылку символов при получении STOP и возобновить посылку вводимых символов при получении START.Если этот бит установлен, управление приостановкой/продолжением передачи на выходном потоке включено. Другими словами, когда компьютер получает символ STOP, он приостанавливает передачу символов до тех пор, пока не получит символ START.
Символы START и STOP никогда не будут переданы в прикладную программу. Если бит не установлен, символы START иSTOP передаются в программу как обычные символы.1.3.2 Локальные режимы терминалаВ этом разделе рассматриваются флаги поля c_lflag структуры struct termios.Эти флаги, как правило, управляют более высокоуровневыми деталями обработки вводимыхсимволов, чем флаги, описанные в предыдущем разделе.Все эти флаги — биты в поле c_lflag структуры struct termios. Это поле имеетодин из целых типов, поэтому флаги можно модифицировать побитовыми операциями &, |,^.
Никогда не задавайте значение c_lflag целиком, изменяйте только нужные флаги, аостальные биты не трогайте.ICANON Если этот бит установлен, ввод с терминала происходит в каноническом режиме. В противном случае ввод работает в неканоническом режиме.ECHOЕсли этот бит установлен, включён режим отображения вводимых символовна терминале (эхо-режим).ISIGЕсли этот бит установлен, распознаются символы INTR, QUIT и SUSP, которые посылают сигналы SIGINT, SIGQUIT и SIGTSTP соответственноосновной группе процессов, ассоциированной с данным терминалом. Работатерминала в каноническом или неканоническом режиме не влияет на специальную обработку этих символов.Использовать запрещение обработки сигнальных символов нужно оченьосторожно, поскольку в этом случае программа не сможет быть интерактивно прервана и будет недружественной пользователю.
Программа тогда должна предоставлять альтернативные способы, эквивалентные нажатию этихспециальных символов.NOFLSH Обычно символы QUIT, INTR, SUSP вызывают сброс входной и выходнойочереди терминала. Если этот бит установлен, очереди не сбрасываются.TOSTOP Если установлен этот бит, и система поддерживает управление заданиями,сигнал SIGTTOU будет послан фоновой группе процессов, если один из процессов группы пытается записать на терминал.1.3.3 Специальные символы терминалаВ каноническом режиме ввода терминал распознаёт некоторые специальные символы,которые выполняют различные управляющие функции. Например, символ ERASE (обычно<Del>) для редактирования вводимой строки и некоторые другие символы.
Символ INTR5(обычно Ctrl-C) для посылки сигнала SIGINT и другие символы, генерирующие сигнал, могут работать и в каноническом, и в неканоническом режиме. Все эти символы описаны вданном разделе.Собственно используемые символы задаются в поле c_cc структуры struct termios.Это поле — массив, в котором каждый элемент задает символ, выполняющий соответствующую функцию. Каждый элемент имеет символическую константу, которая обозначаетиндекс этого элемента в массиве. Например, VINTR — индекс элемента, задающего символINTR, поэтому присваивание значения ’=’ элементу t.c_cc[VINTR] устанавливаетсимвол = как символ прерывания.На некоторых системах каждый специальный символ можно отменить, присвоив значение _POSIX_VDISABLE соответствующему элементу массива. Это значение не равно никакому возможному коду символа.
Этот макрос должен определяться в файле <unistd.h>, иесли он определён, такая функция поддерживается системой.Символы редактирования строкиVEOFЭто — индекс символа EOF в массиве специальных символов структурыstruct termios. Символ EOF распознаётся только в каноническом режиме. Если символ EOF введён не в начале строки, он завершает ввод строки,как символ ’\n’. Если символ EOF введён в начале строки, функция readпри чтении с терминала вернёт 0, обозначая конец файла, а сам символ EOFбудет сброшен. Обычно символ EOF равен Ctrl-D.VEOLИндекс символа EOL в массиве специальных символов. Символ EOL распознаётся только в каноническом режиме ввода.
Как и символ перевода строкион обозначает конец ввода строки. Символ EOL не сбрасывается, а считывается последним символом вводимой строки. Чтобы сделать <RET> символомконца ввода строки, не обязательно задавать символ EOL, а достаточно установить флаг ICRNL. На самом деле, именно такой режим включён по умолчанию.VERASE Индекс символа ERASE в массиве специальных символов. Символ ERASEраспознаётся только в каноническом режиме работы терминала. Когда пользователь вводит этот символ, предыдущий введённый символ уничтожается.Сам символ ERASE тоже уничтожается. Символ ERASE не может использоваться для стирания символов в предыдущих введённых строках.
Обычносимвол ERASE равен <DEL>.VKILLИндекс символа KILL в массиве специальных символов. Символ KILL распознаётся только в каноническом режиме ввода. Когда пользователь вводитсимвол KILL, вся текущая вводимая строка уничтожается. Символ KILL приэтом тоже уничтожается. Обычно символ KILL равен Ctrl-U.Символы посылки сигналовVINTRИндекс символа INTR в массиве специальных символов.
Ввод символа INTRвызывает посылку сигнала SIGINT всем процессам основной группы процессов, ассоциированной с данным терминалом. Символ INTR затем сбрасывается. Обычно символ INTR равен Ctrl-C.VQUITИндекс символа QUIT в массиве специальных символов. Ввод символа QUITвызывает посылку сигнала SIGQUIT всем процессам основной группы процессов, ассоциированной с данным терминалом. Символ QUIT затем сбрасывается.
Обычно символ QUIT равен Ctrl-\.6Индекс символа SUSP в массиве специальных символов. Символ SUSP распознаётся, только если система поддерживает управление заданиями. Еслипользователь вводит этот символ, всем процессам текущей основной группы процессов, ассоциированной с данным терминалом, посылается сигналSIGTSTP. Символ SUSP затем сбрасывается. Обычно символ SUSP равенCtrl-Z.Старт/стоп-символыЭти символы могут распознаваться и в каноническом, и в неканоническом режиме ввода.
Их использование управляется флагами IXON и IXOFF режима ввода терминала.Конкретное значение этих символов может диктоваться аппаратурой подключённоготерминала, поэтому иногда изменение этих символов не имеет никакого эффекта.VSTART Индекс символа START в массиве специальных символов.
Символ STARTиспользуется, чтобы поддерживать режимы ввода IXON и IXOFF. Если флагIXON установлен, получение символа START от терминала возобновляет передачу символов на терминал, сам символ START сбрасывается. Если установлен флаг IXANY, получение любого символа возобновляет приостановленную передачу на терминал, при этом символ не сбрасывается, если только это не символ START. Если установлен флаг IXOFF, система может передавать символ START на терминал, чтобы возобновить получение вводимыхсимволов.
Обычно символ START равен Ctrl-Q.VSTOPИндекс символа STOP в массиве специальных символов. Символ STOP используется, чтобы поддерживать режимы ввода IXON и IXOFF. Если установлен флаг IXON, получение символа STOP вызывает приостановку передачи символов на терминал, сам символ STOP при этом сбрасывается. Еслиустановлен флаг IXOFF, система передаёт на терминал символ STOP, чтобы предотвратить переполнение очереди ввода с терминала. Обычно символSTOP равен Ctrl-S.VSUSP1.3.4 Неканонический вводВ неканоническом режиме ввода специальные символы редактирования, такие какERASE или KILL не имеют специального значения. Системное редактирование строкиотключено, поэтому все вводимые символы, кроме, возможно, специальных символовпосылки сигналов или управления потоком данных, передаются прикладной программеточно в том виде, как они набраны.