[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Неканонический ввод

В обычном режиме символы собираются вместе, пока не будет введена
полная строка, завершенная символом NL. Только после этого вызов
read(2) возвращает управление, даже если он запрашивал только один
символ. Возвращенное вызовом read(2) значение показывает количество
символов, которые были прочитаны на самом деле до ввода NL. Однако в
некоторых прикладных программах, таких, как обработка экранных форм
или полноэкранных редакторах, "строки" ввода не имеют смысла.
Например, эти программы могут требовать символы по мере их ввода с
клавиатуры.  Если очистить флаг ICANON в c_iflag, вводимые символы не
будут собираться в строки и read(2) будет читать их по мере ввода.
Параметры MIN и TIME определяют условия, при которых будет
удовлетворен запрос read(2). MIN определяет минимальное количество
символов, которые должны быть получены. TIME представляет собой таймер
с квантом времени 0.1 секунды. Символы EOF и EOL в неканоническом
режиме не используются, поэтому эти позиции в массиве c_cc[]
используются для MIN и TIME соответственно. Ниже описаны четыре
возможных сочетания значений MIN и TIME:
MIN > 0, TIME > 0.
В этом случае, TIME служит для измерения времени между вводом
одиночных символов и стартует после получения первого символа. Счетчик
времени сбрасывается после каждого очередного символа. Если до
истечения интервала времени будет получено MIN символов, запрос
read(2) удовлетворяется. Если, наоборот, время истекает раньше, чем
было считано MIN символов, то все введенные до этого момента символы
возвращаются пользователю. Замечание: если TIME истекло, то будет
возвращен по крайней мере один символ. Если MIN равен 1, значение TIME
не играет роли.
MIN > 0, TIME = 0
Если значение TIME равно нулю, таймер не используется. Имеет значение
только MIN. В этом случае запрос read(2) удовлетворяется только тогда,
когда получены MIN символов.
MIN = 0, TIME > 0
Если MIN равен нулю, TIME больше не является счетчиком межсимвольного
времени. Теперь таймер активизируется при обработке системного вызова
read(2). Запрос read(2) удовлетворяется когда поступил хотя бы один
символ или истекло время. Если в течении TIME*0.1 секунд после начала
чтения не поступило ни одного символа, запрос возвращает управление с
нулевым количеством прочитанных символов.
MIN = 0, TIME = 0
В этом случае, read(2) возвращает управление немедленно. Возвращается
минимум из запрошенного и имеющегося на данный момент в буфере
количества символов, без ожидания ввода дополнительных символов.
                         НЕКАНОНИЧЕСКИЙ ВВОД

.   Сбросить флаг ICANON в c_lflag

.   Установить MIN и TIME в соответствующие значения.




         значение           когда удовлетворяется запрос read


 MIN > 0, TIME > 0     MIN символов получено или истекло
                       межсимвольное время

 MIN > 0, TIME = 0     MIN символов получено, TIME не играет роли


 MIN = 0, TIME > 0     один символ получен или истекло время с
                       момента запроса

 MIN = 0, TIME = 0     возвращает управление немедленно, считываются
                       только те символы, которые уже находятся в
                       буфере




                     MIN ссылается на c_cc[VMIN]

                    TIME ссылается на c_cc[VTIME]