Считать требуемое количество байт из файлового дескриптора
#include <sys/modem.h>
int modem_read( int fd,
char *buf,
int bufsize,
int quiet,
int timeout,
int flags,
int (*cancel)( void ) );
- fd
- Файловый дескриптор устройства, из которого необходимо прочитать данные; смотрите modem_open().
- buf
- Указатель на буфер, в который будут сохранены данные.
- bufsize
- Размер буфера в байтах.
- quiet
- Максимальное время ожидания (в десятых долях секунды) поступления данных при получении хотя бы одного символа.
- timeout
- Максимальное время ожидания (в десятых долях секунды) любого поступления данных.
- flags
- Флаги для фильтрования и сопоставления полученных символов; комбинация следующих флагов:
- MODEM_ALLOWCASE
- сохранить регистр входящих символов. Без этого флага все буквы будут отображаться с нижним регистром.
- MODEM_ALLOWCTRL
- разрешить управляющие символы. Без этого флага, управляющие символы будут отбрасываются.
- MODEM_ALLOW8BIT
- разрешить сохранение старшего бита получаемых символов. Без данного флага старший бит будет приравнен нулю во всех пришедших символах.
- MODEM_LASTLINE
- отбросить все пришедшие ранее символы при получении символа новой строки, за которым были получены другие символы. Без данного флага может быть возвращён набор символов с множеством строк, заканчивающихся символом новой строки. Если сценарий автоматического входа может быть представлен произвольным текстовым интерфейсом до аутентификации, можно использовать данный флаг для сброса всех строк, кроме строк входа в систему, тем самым уменьшая вероятность ложных срабатываний.
- cancel
NULL
, или указатель на функцию-обработчик, которая должна сработать при истечении времени молчания quiet во время ожидания дополнительного ввода.
libc
Функция modem_read() читает до bufsize байт из устройства, связанного с файловым дескриптором fd, прочитанные данные помещаются в буфер, указанный в buf.
Если данные отсутствуют, без timeout modem_read() вернёт -1
.
Если был получен хотя бы один символ, modem_read() закончит чтение после того, как поток символов, поступающих в устройство, остановится как минимум на quiet времени. Число символов, сохранённых в buf, будет возвращено данной функцией.
Если задана функция cancel, данная функция будет срабатывать раз в период времени quiet, пока ожидается ввод. Если данная функция возвращает ненулевое значение, modem_read() вернёт -1
немедленно и установить для errno значение ETIMEDOUT
. Вы можете использовать функцию cancel в графическом номеронабирателе, который должен поддерживать кнопку отмены для остановки скрипта (смотрите modem_script()).
- 0
- Успешное завершение.
- -1
- Возникла ошибка. Код ошибки записан в errno.
- EAGAIN
- Установлен флаг
O_NONBLOCK
при открытии файлового дескриптора fd, процесс заблокирован при попытке выполнить операцию. - EBADF
- Аргумент fd некорректен или файл, связанный с данным дескриптором, не открыт.
- EINTR
- Вызов readcond() был прерван процессом из-за получения сигнала.
- EIO
- Процесс в настоящее время не может считывать данные из fd.
- ENOSYS
- Функция не поддерживается для данного fd.
ЗОСРВ «Нейтрино»
- Да
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Смотри ниже
- В потоке
- Смотри ниже
Безопасность использования modem_read() внутри обработчика сигнала или потока зависит от того, какие операции проводит установленный обработчик cancel.
modem_open(), modem_script(), modem_write()
Предыдущий раздел: Описание API системной библиотеки