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

• Включено редактирование строк, что позволяет изменять содержимое текущей строки. Следовательно, поддерживаются следующие символы: ERASE, KILL и (если установлен флаг IEXTEN) WERASE.

• Символы REPRINT и LNEXT тоже разрешены, если установлен флаг IEXTEN.

В каноническом режиме операция read() в терминале возвращается, когда доступна полная строка (сам вызов read() может вернуть только часть данной строки, если было запрошено недостаточно байтов; оставшиеся символы будут извлечены при последующем чтении). Вызов read() может также преждевременно завершиться, если прерван обработчиком сигнала, а перезапуск системных вызовов для этого сигнала отключен (см. раздел 21.5).

При описании флага NOFLSH в разделе 58.5 мы отмечали, что символы, генерирующие сигналы, тоже заставляют драйвер терминала сбросить входящую очередь. Так происходит вне зависимости от того, был сигнал перехвачен или проигнорирован. Установка флага NOFLSH позволяет предотвратить это сбрасывание.


58.6.2. Неканонический режим

Некоторым приложениям (таким как vi и less) нужно считывать ввод посимвольно, не дожидаясь перехода на новую строку. Для таких случаев предусмотрен неканонический режим. Когда он включен (то есть сброшен флаг ICANON), ввод не проходит никакой специальной обработки. В частности, вводимые символы больше не группируются в строки, а сразу становятся доступными.

В каких обстоятельствах неканоническая операция read() считается завершенной? Можно сделать так, чтобы результат чтения возвращался спустя определенный промежуток времени или после прочтения определенного количества байтов (или в зависимости от сочетания этих условий). Данное поведение регулируется двумя элементами массива c_cc в структуре termios: TIME и MIN. Первый (индексируется с помощью константы VTIME) определяет время ожидания значения в десятых долях секунды, второй (индексируется путем VMIN) — минимальное количество байтов для чтения (ни один из этих элементов не влияет на ввод/вывод терминала в каноническом режиме).

То, как элементы MIN и TIME ведут себя и взаимодействуют друг с другом, зависит от того, содержит ли каждый из них ненулевое значение. Ниже перечислены четыре возможных сценария. Обратите внимание: в каждом из этих случаев (если на момент чтения уже доступен достаточный объем данных, удовлетворяющий условию MIN) операция read() немедленно возвращает количество байтов, меньшее, чем было доступно и указано в запросе.


MIN == 0, TIME == 0 (активное чтение)

Если на момент вызова данные доступны, то read() немедленно возвращает те из них, объем которых меньше доступных и указанных в запросе. Если доступных байтов не обнаружено, то read() сразу же возвращает 0.

Приведенный сценарий удовлетворяет стандартным требованиям, предъявляемым к активному чтению, позволяя программе проверять наличие ввода и не блокировать выполнение, если данные недоступны. Этот режим в чем-то похож на эффект от установки флага терминала O_NONBLOCK (см. раздел 5.9). Однако при отсутствии данных операция read() с флагом O_NONBLOCK возвращает -1 вместе с ошибкой EAGAIN.


MIN > 0, TIME == 0 (блокирующее чтение)

Вызов read() блокируется (возможно, перманентно), пока объем доступных данных не будет равен меньшему из запрошенных значений или параметру MIN; в результате возвращается меньшее из двух значений.

Такие программы, как less, обычно присваивают MIN значение 1, а TIME — 0. Это позволяет ждать нажатия одиночных клавиш, не затрачивая процессорное время на постоянные запросы, выполняемые в цикле.

Если терминал находится в неканоническом режиме, а значения MIN и TIME равны соответственно 1 и 0, то методики, описанные в главе 59, можно использовать для проверки ввода одиночного символа (а не целой строки).


MIN == 0, TIME > 0 (чтение с временным интервалом)

При вызове read() запускается таймер. Результат возвращается, как только станет доступным хотя бы один байт или по истечении десятых долей секунды, указанных с помощью TIME. Во втором случае read() возвращает 0.

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


MIN > 0, TIME > 0 (чтение с побайтовым временным интервалом)

Таймер перезапускается с появлением каждого нового байта, начиная с первого. Операция read() возвращается после прочтения количества байтов, которое либо меньше MIN, либо равно значению, указанному при запросе, или же когда истекает время ожидания (TIME, заданное в десятых долях секунды) между чтением двух соседних байтов. Поскольку таймер запускается только с появлением начального байта, read() возвращает как минимум один байт (в такой ситуации чтение может заблокироваться навсегда).

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

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

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#.Введите сюда краткую аннотацию

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

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