Читаем Linux API. Исчерпывающее руководство полностью

• Неканонический. Ввод терминала не делится на строки. Такие программы, как vi, more и less, переключаются в данный режим, чтобы иметь возможность считывать отдельные символы, не требуя от пользователя нажатия клавиши Enter.

Драйвер терминала также интерпретирует ряд специальных символов, таких как прерывание (обычно Ctrl+C) и конец файла (обычно Ctrl+D). Это может приводить к генерированию сигнала для фоновой группы процессов или выполнению некоего условия, которого ожидает программа, считывающая данные из терминала. Программы, переключающие терминал в неканонический режим, обычно также отключают часть специальных символов (или все).

Драйвер терминала управляет двумя очередями (см. рис. 58.1): одна — для ввода символов, передающихся из устройства в считывающий процесс (их может быть несколько), а другая — для вывода символов, которые процесс передает терминалу. Если включена функция эхо-контроля, драйвер автоматически добавляет копию любого введенного символа в конец исходящей очереди; это позволяет отображать в терминале вводимый текст.

Стандарт SUSv3 оговаривает ограничение MAX_INPUT, позволяющее системе устанавливать максимальную длину входящей очереди терминала. Еще одно ограничение, MAX_CANON, определяет максимальное количество байтов, которое может содержаться в одной строке в каноническом режиме. В Linux вызовы sysconf(_SC_MAX_INPUT) и sysconf(_SC_MAX_CANON) возвращают значение 255. Однако ни одно из этих ограничений не используется самим ядром, имеющим собственное ограничение для размера входящей очереди — 4096 байт. Аналогичное ограничение существует и для исходящей очереди, но оно не влияет на работу приложений, поскольку в случае если процесс генерирует вывод быстрее, чем драйвер может его обработать, то ядро приостанавливает выполнение данного процесса, пока в исходящей очереди опять не появится свободное место.

В Linux доступен вызов ioctl(fd, FIONREAD, &cnt), позволяющий получить количество непрочитанных байтов во входящей очереди терминала, на который указывает файловый дескриптор fd. Эта возможность не предусмотрена стандартом SUSv3.


58.2. Извлечение и изменение атрибутов терминала


Для извлечения и изменения атрибутов терминала предусмотрены функции tcgetattr() и tcsetattr().

#include


int tcgetattr(int fd, struct termios *termios_p);

int tcsetattr(int fd, int optional_actions,

const struct termios *termios_p);

Обе функции возвращают 0 при успешном завершении или -1 при ошибке



Рис. 58.1. Входящая и исходящая очереди терминального устройства


Аргумент fd представляет собой файловый дескриптор, который должен ссылаться на терминал (в противном случае эти функции завершаются ошибкой ENOTTY).

Аргумент termios_p является указателем на структуру termios, хранящую атрибуты терминала:

struct termios {

tcflag_t c_iflag; /* Флаги ввода */

tcflag_t c_oflag; /* Флаги вывода */

tcflag_t c_cflag; /* Управляющие флаги */

tcflag_t c_lflag; /* Локальные режимы */

cc_t c_line; /* Порядок следования строк (нестандартное) */

cc_t c_cc[NCCS]; /* Специальные символы терминала */

speed_t c_ispeed; /* Скорость ввода (нестандартное; не используется) */

speed_t c_ospeed; /* Скорость вывода (нестандартное; не используется) */

};

Первые четыре поля структуры termios — битовые маски (тип данных tcflag_t представлен целым числом подходящего размера), содержащие флаги, которые влияют на различные аспекты работы драйвера терминала:

• c_iflag содержит флаги, управляющие вводом терминала;

• c_oflag содержит флаги, управляющие выводом терминала;

• c_cflag содержит флаги, связанные с аппаратным управлением последовательного порта;

• c_lflag содержит флаги, управляющие пользовательским интерфейсом для терминального ввода.

Все флаги, используемые в приведенных выше полях, будут перечислены в табл. 58.2 далее.

Поле c_line определяет порядок следования строк для текущего терминала. С целью поддержки эмуляторов терминала оно всегда равно N_TTY; это новый режим, который является частью кода ядра, занимающегося работой с терминалом и реализующего обработку ввода/вывода в каноническом режиме. Изменение данного поля имеет смысл при программировании последовательных портов.

Массив c_cc содержит специальные символы терминала (прерывания, приостановку и т. д.), а также поле, отвечающее за работу неканонического режима ввода. Тип данных cc_t представляет собой беззнаковое целое число, подходящее для хранения этих значений, а константа NCCS определяет количество элементов в данном массиве. Специальные символы терминала описаны в разделе 58.4.

Поля c_ispeed и c_ospeed не используются в Linux (и не предусмотрены стандартом SUSv3). О том, как эта ОС хранит данные о скорости последовательного порта, мы расскажем в разделе 58.7.

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных