Читаем 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() возвращает как минимум один байт (в такой ситуации чтение может заблокироваться навсегда).

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

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

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

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

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

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

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