Структура termios используется для представления характеристик терминального устройства. Структура одна и та же для всех терминальных устройств, независимо от изготовителя аппаратуры. Это предоставляет единообразный способ изменения характеристик и поведения терминального устройства. В частности, эта структура используется модулем STREAMS для изменения поведения аппаратного и программного интерфейса ввода/вывода.
Ниже перечислены поля структуры termios:
c_iflag флаги, управляющие предобработкой ввода с терминала.
c_oflag флаги, управляющие системной постобработкой вывода на терминал.
c_cflag флаги, описывающие аппаратные характеристики терминального интерфейса.
c_lflag флаги, управляющие разбиением потока на строки.
c_cc[] массив специальных управляющих символов.
Эти поля будут подробнее обсуждаться далее в этом разделе.
Ссылка: /usr/include/sys/termios.h
Управляющие символы, определенные в массиве c_cc[] имеют специальное значение и могут быть изменены вызовом tcsetattr(). На следующей странице в колонке индекс приведены символьные константы, определенные в <termios.h>. Эти символьные константы могут быть использованы как индексы в массиве c_cc[]. Значения по умолчанию для соответствующих элементов перечислены в колонке c_cc[индекс]. Некоторые из этих управляющих символов описаны ниже.
Следует иметь в виду, что в кодировке ASCII, первые 32 символа зарезервированы для выполнения различных управляющих функций (см. ascii(5)). Видеотерминалы и терминальные эмуляторы генерируют такие символы при одновременном нажании комбинации алфавитных (или некоторых неалфавитных) клавиш и клавиши Ctrl. Нажатие клавиши Ctrl приводит к срезанию старших бит кода соответствующего символа. Исключение составляет комбинация Ctrl-?, которая выдает код '\0x1F' (ASCII DEL). Так, комбинация клавиш Ctrl-D — это символ '\0x3' (ASCII EOT).
VINTR (Ctrl-C или ASCII DEL) генерирует сигнал SIGINT, который посылается всем процессам в группе первого плана, связанной с этим терминалом. По умолчанию процесс при получении этого сигнала будет завершен, но он может проигнорировать этот сигнал или перехватить его при помощи функции обработки.
VQUIT (CTRL-\) генерирует сигнал SIGQUIT. Этот сигнал обрабатывается так же, как и SIGINT.
VERASE (Сtrl-H, Ctrl-? или #) стирает предыдущий символ. Он не может стереть символ перед началом строки, ограниченной символами NL, EOF, EOL или EOL2.
VWERASE (CTRL-W) очищает предыдущее "слово". Он не может стереть слово из предыдущей строки, ограниченной символами NL, EOF, EOL или EOL2. Это функция расширения, поэтому для ее использования необходимо установить флаг IEXTEN.
VKILL (Ctrl-U) стирает всю строку, ограниченную символами NL, EOF, EOL или EOL2.
VEOF (CTRL-D) может использоваться для обозначения конца файла при вводе с терминала. Когда получен этот cимвол, все символы, ожидающие считывания, будут немедленно переданы программе, без ожидания символа новой строки, и остаток строки игнорируется. Таким образом, если в очереди не было символов, то есть EOF был послан в начале строки, read получит ноль символов, что является стандартным обозначением конца файла.
(Продолжение на следующей странице)
VSTOP (CTRL-S) может использоваться для временной приостановки вывода. Это полезно на экранных терминалах, чтобы вывод не исчезал с экрана, пока пользователь его не прочитал. Если вывод уже приостановлен, вводимые СТОП-символы игнорируются и не будут прочитаны.
VSTART (CTRL-Q) используется для возобновления вывода, остановленного СТОП-символом. Если ввод не был приостановлен, символы VSTART игнорируются и не читаются.
VSUSP (CTRL-Z) генерирует сигнал SIGTSTP, который приостанавливает все процессы в группе процессов первого плана этого терминала. Например, этот символ используется для функций управления заданиями в shell.
VDISCARD (CTRL-O) приводит к тому, что весь вывод будет игнорироваться, пока не будет послан еще один символ DISCARD, программа не выведет новые символы или не сбросит соответствующее условие. Это функция расширения, и исполняется, только если установлен флаг IEXTEN.
VLNEXT (CTRL-V) игнорирует специальное значение следующего символа. Это работает для всех специальных символов из массива c_cc[]. Это позволяет вводить символы, которые в ином случае были бы проинтерпретированы системой (такие, как KILL, QUIT). Символы VERASE, VKILL и VEOF могут также быть введены после символа обратной косой черты (backslash, \). В этом случае они также не вызовут исполнения специальной функции.
VREPRINT (CTRL-R или ASCII DC2) печатает символ новой строки и все символы, которые ожидали в очереди ввода (как если бы это была новая строка). Это считается функцией расширения, поэтому работает, только если установлен IEXTEN.
Для изменения управляющего символа, необходимо получить текущие терминальные атрибуты вызовом tcgetattr(3C), присвоить требуемому элементу массива c_cc[] новое значение и изменить атрибуты терминала вызовом tcsetattr(3C). Если значение управляющего символа будет _POSIX_VDISABLE, то функция, ассоциированная с этим символом, будет выключена.