Книга: Разработка приложений в среде Linux. Второе издание
16.5.9. Управление read()
16.5.9. Управление read()
Два элемента в массиве с_сс
не являются управляющими символами и имеют отношение только к неформатируемому режиму: VTIME
и VMIN
. В этом режиме они определяют, когда возвращается read()
. В каноническом режиме read()
возвращается только в том случае, если строки были собраны или был достигнут конец файла, за исключением случая установки опции O_NONBLOCK
.
В неформатируемом режиме считывание по одному байту за раз неэффективно. Также неэффективно опрашивать порт чтением в неблокируемом режиме. Существуют два намного более эффективных дополнительных метода чтения.
Первый заключается в использовании poll()
, как описано в главе 13 и демонстрируется в коде robin.с
. Если poll()
сообщает, что файловый дескриптор готов к чтению, то известно, что вы можете немедленно прочитать некоторое количество байтов. Однако сочетание poll()
со вторым методом сделает ваш код более эффективным, предоставляя возможность считывать больше байтов за один раз.
"Управляющие символы" VTIME
и VMIN
состоят в сложных взаимоотношениях. VTIME
определяет промежуток времени для ожидания в десятых долях секунды (он не может быть больше cc_t
, обычно это 8-битный unsigned char
), который также может равняться нулю. VMIN
определяет минимальное количество байт для ожидания (не для считывания — третий аргумент read()
определяет максимальное количество байтов для считывания), которое тоже может равняться нулю.
• Если VTIME
равен нулю, VMIN
определяет количество байт для ожидания. Вызов read()
не возвращается, пока не будут считано VMIN
байт или пока не будет получен сигнал.
• Если VMIN
равен нулю, VTIME
определяет количество десятых частей секунд для ожидания read()
перед возвращением, даже если данные недоступны. В таком случае read()
, возвращающий нуль, необязательно сигнализирует о состоянии конца файла, как он обычно делает.
• Если ни VTIME
, ни VMIN
не равняются нулю, VTIME
определяет количество десятых долей секунды для ожидания read()
после того, как будет доступен хотя бы один байт. Если данные доступны при вызове read()
, таймер немедленно запускается. Если данные недоступны при вызове read()
, таймер запускается при принятии первого байта. Вызов read()
возвращается или тогда, когда были приняты хотя бы байты VMIN
, или по истечении таймера, независимо от того, что произойдет раньше. Он всегда возвращает хотя бы один байт, поскольку таймер не запускается, пока не будет доступен хотя бы один байт.
• Если и VTIME
, и VMIN
равны нулю, read()
всегда немедленно возвращается, даже если данные недоступны. И снова ноль необязательно указывает на состояние конца файла.
- 5.4. Управление интерфейсом и выполнение команд
- Управление потоками
- Управление портами завершения ввода
- Глава 7 Reader
- Листинг 4.14. (condvar.c) Управление работой потока с помощью сигнальной переменной
- Класс StreamReader
- How to read
- УПРАВЛЕНИЕ РЕПУТАЦИЕЙ В ИНТЕРНЕТЕ
- Глава 7 Управление хранилищем данных
- Глава 11 Корпоративное управление и стратегия
- 5.7 Устройства NAS под управлением Windows и моментальные снимки
- 7.8 Управление иерархическим хранилищем