ИМЯ
termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush,
tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed,
cfsetspeed -
возвращает
и задаёт
атрибуты
терминала,
управляет
линией,
возвращает
и задаёт
скорость
передачи
ОБЗОР
#include <termios.h>
#include <unistd.h>
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions,
const struct termios *termios_p);
int tcsendbreak(int fd, int duration);
int tcdrain(int fd);
int tcflush(int fd, int queue_selector);
int tcflow(int fd, int action);
void cfmakeraw(struct termios *termios_p);
speed_t cfgetispeed(const struct termios *termios_p);
speed_t cfgetospeed(const struct termios *termios_p);
int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
int cfsetspeed(struct termios *termios_p, speed_t speed);
Требования
макроса
тестирования
свойств
для glibc (см.
feature_test_macros(7)):
cfsetspeed(), cfmakeraw():
начиная с glibc 2.19:
_DEFAULT_SOURCE
glibc 2.19 и старее:
_BSD_SOURCE
ОПИСАНИЕ
Функции termios
описывают
общий
интерфейс
терминала,
который
предоставляет
управление
асинхронными
портами
связи.
Структура
termios
Множество
описанных
здесь
функций
имеют
аргумент
termios_p, который
является
указателем
на
структуру
termios. В этой
структуре
есть, по
крайней
мере,
следующие
поля:
tcflag_t c_iflag; /* режимы ввода */
tcflag_t c_oflag; /* режимы вывода */
tcflag_t c_cflag; /* режимы управления */
tcflag_t c_lflag; /* локальные режимы */
cc_t c_cc[NCCS]; /* специальные символы */
Значения
этих полей
описаны
далее. Для
первых
четырёх
полей
битовых
масок
определения
некоторых
флагов
доступны
только,
если
определён
специальный
макрос
тестирования
свойств
(смотрите
feature_test_macros(7)), как
указано в
квадратных
скобках
(«[]»).
В
описаниях
ниже
приписка
«нет в POSIX»
означает,
что
значение
не описано
в POSIX.1-2001, а «XSI» —
что
значение
описано в
POSIX.1-2001 как
часть
расширения
XSI.
Константы
флага c_iflag:
- IGNBRK
- Игнорировать
состояние
BREAK в вводе.
- BRKINT
- Если
указан IGNBRK,
то BREAK
игнорируется.
Если он не
указан, а BRKINT
указан, то BREAK
вызывает
сброс (flushed)
очередей
ввода и
вывода, и,
если
терминал
является
управляющим
для
активной
(foreground) группы
процессов,
то этой
группе
посылается
сигнал SIGINT.
Если IGNBRK и BRKINT
не указаны,
то BREAK
считывается
как байт null
(«\0»), кроме
случая,
когда
указан PARMRK,
тогда он
будет
прочитан
как
последовательность
\377 \0 \0.
- IGNPAR
- Игнорировать
ошибки
кадра и
чётности.
- PARMRK
- Если этот
бит
установлен,
то
входящие
байты с
ошибками
чётности
или кадра
помечаются
при
передаче в
программу.
Этот бит
значим,
только
когда
установлен
бит INPCK и не
установлен
бит IGNPAR.
Байты с
ошибками
помечаются
двумя
предваряющими
их байтами
\377 и \0. То есть
программа,
на самом
деле,
читает три
байта при
получении
одного
байта с
ошибками с
терминала.
Если
корректный
байт имеет
значение \377
и бит ISTRIP
(смотрите
далее) не
установлен,
то
программа
может
ошибочно
посчитать
его как
помечающий
ошибки
чётности.
Поэтому в
этом
случае
корректный
байт \377
передаётся
программе
как два
байта, \377 \377.
- Если IGNPAR или
PARMRK не
указаны, то
символ с
ошибкой
чётности
или кадра
считывается
как \0.
- INPCK
- Включить
проверку
чётности
ввода.
- ISTRIP
- Удалять
восьмой
бит.
- INLCR
- Преобразовывать
NL в CR в вводе.
- IGNCR
- Игнорировать
возврат
каретки в
вводе.
- ICRNL
- Преобразовывать
возврат
каретки в
символ
новой
строки в
вводе (если
не указан
IGNCR).
- IUCLC
- (нет в POSIX)
Переводить
заглавные
буквы в
прописные
в вводе.
- IXON
- Включить
управление
потоком XON/XOFF в
выводе.
- IXANY
- (XSI) Набор
любого
символа
запускает
остановленный
вывод (по
умолчанию
только
символ START
заново
запускает
вывод).
- IXOFF
- Включить
управление
потоком XON/XOFF в
вводе.
- IMAXBEL
- (нет в POSIX)
Выдавать
звуковой
сигнал,
когда
очередь
ввода
переполняется.
В Linux не
реализован
этот бит и
его
действие
выполняется
всегда.
- IUTF8
(начиная с Linux
2.6.4)
- (нет в POSIX) Ввод
в UTF8; это
позволяет
символу
стирания
(character-erase)
правильно
работать в
режиме
предварительной
обработки
(cooked mode).
Константы
флага c_oflag:
- OPOST
- Включить
обработку
вывода,
определяемую
реализацией.
- OLCUC
- (нет в POSIX)
Переводить
прописные
буквы в
заглавные
в выводе.
- ONLCR
- (XSI)
Преобразовывать
NL в CR-NL в
выводе.
- OCRNL
- Преобразовывать
CR в NL в
выводе.
- ONOCR
- Не
выводить CR
в столбец 0.
- ONLRET
- Не
выводить CR.
- OFILL
- Посылать
символы
заполнения
для
задержки, а
не
использовать
временную
задержку.
- OFDEL
- Символ
заполнения
ASCII DEL (0177). Если не
указано, то
используется
ASCII NUL («\0») (не
реализовано
в Linux).
- NLDLY
- Маска
задержки
новой
строки.
Значениями
могут быть
NL0 и NL1
[требуется
_BSD_SOURCE, _SVID_SOURCE или
_XOPEN_SOURCE].
- CRDLY
- Маска
задержки
перевода
каретки.
Значениями
могут быть
CR0, CR1, CR2 или CR3
[требуется
_BSD_SOURCE, _SVID_SOURCE или
_XOPEN_SOURCE].
- TABDLY
- Маска
задержки
горизонтальной
табуляции.
Значениями
могут быть
TAB0, TAB1, TAB2, TAB3
(или XTABS, но
смотрите
раздел BUGS).
Значение TAB3,
то есть, XTABS,
раскрывает
табуляцию
в пробелы
(один
символ
табуляции
— восемь
столбцов)
[требуется
_BSD_SOURCE, _SVID_SOURCE или
_XOPEN_SOURCE].
- BSDLY
- Маска
задержки
символа
забоя.
Значениями
могут быть
BS0 или BS1
(никогда не
была
реализована)
[требуется
_BSD_SOURCE, _SVID_SOURCE или
_XOPEN_SOURCE].
- VTDLY
- Маска
задержки
вертикальной
табуляции.
Значениями
могут быть
VT0 или VT1.
- FFDLY
- Маска
задержки
прокрутки
страницы.
Значениями
могут быть
FF0 или FF1
[требуется
_BSD_SOURCE, _SVID_SOURCE или
_XOPEN_SOURCE].
Константы
флага c_cflag:
- CBAUD
- (нет в POSIX)
Маска
скорости в
бодах (4+1
бита)
[требуется
_BSD_SOURCE или _SVID_SOURCE].
- CBAUDEX
- (нет в POSIX)
Дополнительная
маска
скорости в
бодах (1 бит),
включена в
CBAUD
[требуется
_BSD_SOURCE или _SVID_SOURCE].
- В
стандарте
POSIX указано,
что
скорость в
бодах
хранится в
структуре
termios без
указания
её точного
местонахождения,
и для
работы к
ней
используются
cfgetispeed() и cgfsetispeed(). В
некоторых
системах
используются
биты,
выбираемые
CBAUD в c_cflag, в
других
используются
отдельные
поля,
например
sg_ispeed и sg_ospeed.
- CSIZE
- Маска
размера
символа.
Значениями
могут быть
CS5, CS6, CS7 или
CS8.
- CSTOPB
- Использовать
два
стоповых
бита
вместо
одного.
- CREAD
- Включить
приёмник.
- PARENB
- Запустить
генерацию
чётности
при выводе
и проверку
чётности
на вводе.
- PARODD
- Если
указано, то
при вводе и
выводе
используется
отрицательная
чётность, в
противном
случае
используется
положительная
чётность.
- HUPCL
- Выключить
управляющие
линии
модема
после того,
как
последний
процесс
прекратит
использование
устройства
(повесит
трубку).
- CLOCAL
- Игнорировать
управляющие
линии
модема.
- LOBLK
- (нет в POSIX)
Блокировать
вывод из не
текущего
уровня
оболочки
(для
использования
в shl (shell layers), не
реализовано
в Linux).
- CIBAUD
- (нет в POSIX)
Маска
скоростей
ввода. Для
битов CIBAUD
используются
те же
значения,
что и для
битов CBAUD, но
они
смещены
влево на ISHIFT
битов
[требуется
_BSD_SOURCE или _SVID_SOURCE]
(не
реализовано
в Linux).
- CMSPAR
- (нет в POSIX)
Использовать
«липкую»
(есть/нет)
чётность
(поддерживается
в
некоторых
последовательных
устройствах):
если задан
PARODD, то бит
чётности
всегда 1;
если PARODD не
задан, то
бит
чётности
всегда 0
[требуется
_BSD_SOURCE или _SVID_SOURCE].
- CRTSCTS
- (нет в POSIX)
Разрешить
(аппаратное)
управление
потоком
данных RTS/CTS
[требуется
_BSD_SOURCE или _SVID_SOURCE].
Константы
флага c_lflag:
- ISIG
- При
получении
символов INTR,
QUIT, SUSP или DSUSP
генерировать
соответствующий
сигнал.
- ICANON
- Включить
канонический
режим
(описан
далее).
- XCASE
- (нет в POSIX; не
поддерживается
в Linux) Если
также
указан ICANON,
то
терминал
работает
только с
символами
в верхнем
регистре.
Ввод
преобразуется
в символы
нижнего
регистра,
кроме
символов,
предваряемых
\. При
выводе
предваряемые
\ символы в
верхнем
регистре и
символы в
нижнем
регистре
преобразуются
в символы
верхнего
регистра [requires
_BSD_SOURCE, _SVID_SOURCE или
_XOPEN_SOURCE].
- ECHO
- Отображать
вводимые
символы.
- ECHOE
- Если также
указан ICANON,
то символ ERASE
стирает
предыдущий
введённый
символ, а WERASE
стирает
предыдущее
слово.
- ECHOK
- Если также
указан ICANON,
то символ KILL
стирает
текущую
строку.
- ECHONL
- Если также
указан ICANON,
то символ NL
отображается,
даже если
не указан
ECHO.
- ECHOCTL
- (нет в POSIX) Если
также
указан ECHO,
то
специальные
символы
терминала,
кроме TAB, NL, START и STOP,
отображаются
как ^X, где X —
символ из
таблицы ASCII с
кодом на 0x40
больше, чем
у
специального
символа.
Например,
символ 0x08 (BS)
отобразится
как ^H
[требуется
_BSD_SOURCE или _SVID_SOURCE].
- ECHOPRT
- (нет в POSIX) Если
также
указаны ICANON
и IECHO, то
символы
печатаются
по мере
того, как
они
стираются
[требуется
_BSD_SOURCE или _SVID_SOURCE].
- ECHOKE
- (нет в POSIX) Если
также
указан ICANON,
то KILL
выводится
стиранием
каждого
символа в
строке, как
задано ECHOE и
ECHOPRT
[требуется
_BSD_SOURCE или _SVID_SOURCE].
- DEFECHO
- (нет в POSIX)
Выводить (echo)
только в
момент
чтения
процессом
(не
реализовано
в Linux).
- FLUSHO
- (нет в POSIX; не
поддерживается
в Linux)
Выводимые
данные
сбрасываются
(flushed). Этот
флаг
переключается
с помощью
набираемого
символа DISCARD
[требуется
_BSD_SOURCE или _SVID_SOURCE].
- NOFLSH
- Отключить
сброс (flushing)
очередей
ввода и
вывода во
время
генерации
сигналов
из-за
символов INT, QUIT
и SUSP.
- TOSTOP
- Послать
сигнал SIGTTOU
группе
процессов
фонового
процесса,
который
пытается
писать на
управляющий
терминал.
- PENDIN
- (нет в POSIX; не
поддерживается
в Linux) Все
символы в
очереди
ввода
повторно
печатаются,
когда
читается
последующий
символ (это
используется
в bash(1) для
перехвата
набираемого)
[требуется
_BSD_SOURCE или _SVID_SOURCE].
- IEXTEN
- Включить
обработку
ввода,
определяемую
реализацией.
Этот флаг,
как и ICANON,
должен
быть
включён
для
обработки
специальных
символов EOL2,
LNEXT, REPRINT, WERASE, а также
для того,
чтобы
работал
флаг IUCLC.
Массивом
c_cc
определяются
специальные
символы
терминала.
Символьные
индексы
(начальные
значения) и
их смысл:
- VDISCARD
- (нет в POSIX; не
поддерживается
в Linux; 017, SI, Ctrl-O)
Переключатель:
включить/выключить
отбрасывание
ожидающего
вывода.
Распознаётся,
если
указан IEXTEN и,
в этом
случае, не
передаётся
как ввод.
- VDSUSP
- (нет в POSIX; не
поддерживается
в Linux; 031, EM, Ctrl-Y)
Символ
отложенного
приостанова
(DSUSP). Посылает
сигнал SIGTSTP
при
считывании
символа
программой
пользователя.
Распознаётся,
если
указаны IEXTEN
и ISIG, и
система
поддерживает
управление
заданиями.
В этом
случае не
передаётся
как ввод.
- VEOF
- (004, EOT, Ctrl-D) Символ
конца
файла (EOF).
Этот
символ
заставляет
переслать
ждущий
обработки
буфер tty
ожидающей
программе
пользователя
без
ожидания
конца
строки.
Если это
первый
символ в
строке, то
read(2) вернёт
программе
0, что
означает
конец
файла.
Распознаётся,
если
указан ICANON, и,
в этом
случае, не
передаётся
как ввод.
- VEOL
- (0, NUL)
Дополнительный
символ
конца
строки (EOL).
Распознаётся,
если
указан ICANON.
- VEOL2
- (нет в POSIX; 0, NUL) Ещё
один
символ
конца
строки (EOL2).
Распознаётся,
если
указан ICANON.
- VERASE
- (0177, DEL, rubout, или 010, BS, Ctrl-H, а
также #)
Символ
забоя (ERASE).
Стирает
предыдущий
ещё не
стёртый
символ, но
не стирает
за EOF или
началом
строки.
Распознаётся,
если
указан ICANON, и,
в этом
случае, не
передаётся
как ввод.
- VINTR
- (003, ETX, Ctrl-C, а также 0177,
DEL, rubout) Символ
прерывания
(INTR). Посылает
сигнал SIGINT.
Распознаётся,
если
указан ISIG, и,
в этом
случае, не
передаётся
как ввод.
- VKILL
- (025, NAK, Ctrl-U, или Ctrl-X, а
также @)
Символ
уничтожения
(KILL). Стирает
ввод
начиная с
последнего
EOF или
начала
строки.
Распознаётся,
если
указан ICANON, и,
в этом
случае, не
передаётся
как ввод.
- VLNEXT
- (нет в POSIX; 026, SYN, Ctrl-V)
Следующий
символ —
литера (LNEXT).
Экранирует
следующий
введённый
символ,
отменяя
его
возможное
специальное
значение.
Распознаётся,
если
указан IEXTEN и,
в этом
случае, не
передаётся
как ввод.
- VMIN
- Минимальное
количество
символов
для
неканонического
чтения (MIN).
- VQUIT
- (034, FS, Ctrl-\) Символ
завершения
(QUIT). Посылает
сигнал SIGQUIT.
Распознаётся,
если
указан ISIG, и,
в этом
случае, не
передаётся
как ввод.
- VREPRINT
- (нет в POSIX; 022, DC2, Ctrl-R)
Вывести
заново
непрочитанные
символы (REPRINT).
Распознаётся,
если
указан ICANON и
IEXTEN и, в этом
случае, не
передаётся
как ввод.
- VSTART
- (021, DC1, Ctrl-Q) Символ
запуска (START).
Перезапускает
вывод,
остановленный
символом
останова.
Распознаётся,
если
указан IXON и,
в этом
случае, не
передаётся
как ввод.
- VSTATUS
- (нет в POSIX; не
поддерживается
в Linux; запрос
состояния:
024, DC4, Ctrl-T). Символ
состояния
(STATUS). Выводит
информацию
о
состоянии
на
терминал,
включая
состояние
активного
(foreground)
процесса и
количество
потраченного
времени ЦП.
Также
посылает
сигнал SIGINFO
(не
поддерживается
в Linux)
активной
группе
процессов.
- VSTOP
- (023, DC3, Ctrl-S) Символ
останова (STOP).
Приостанавливает
вывод до
появления
символа
запуска.
Распознаётся,
если
указан IXON и,
в этом
случае, не
передаётся
как ввод.
- VSUSP
- (032, SUB, Ctrl-Z) Символ
приостанова
(SUSP). Посылает
сигнал SIGTSTP.
Распознаётся,
если
указан ISIG и,
в этом
случае, не
передаётся
как ввод.
- VSWTCH
- (нет в POSIX; не
поддерживается
в Linux; 0, NUL) Символ
переключения
(SWTCH).
Используется
в System V для
переключения
оболочек в
слоях
оболочек,
предшественник
механизма
управления
задачами в
оболочке.
- VTIME
- Время
ожидания в
децисекундах
для
неканонического
чтения (TIME).
- VWERASE
- (нет в POSIX; 027, ETB, Ctrl-W)
Стирание
слова (WERASE).
Распознаётся,
если
указан ICANON и
IEXTEN и, в этом
случае, не
передаётся
как ввод.
Отдельные
специальные
терминальные
символы
могут быть
выключены
указанием
значения
_POSIX_VDISABLE в
соответствующем
элементе
c_cc.
Все
значения
индексов
этих
символов
различны,
за
исключением
VTIME, VMIN,
которые
могут
иметь те же
значения,
что и VEOL, VEOF,
соответственно.
В
неканоническом
режиме
значения
специальных
символов
используются
как
значения
времени
ожидания.
Предназначение
VMIN и VTIME
смотрите в
описании
неканонического
режима
далее.
Получение
и
изменение
настроек
терминала
Функция
tcgetattr()
возвращает
параметры,
связанные
с объектом,
на который
ссылается
fd, сохраняя
их в
структуре
termios, на
которую
указывает
termios_p. Эта
функция
может быть
вызвана из
фонового
процесса;
однако,
атрибуты
терминала
могут в
дальнейшем
измениться
активным
процессом.
Функция
tcsetattr()
изменяет
параметры
терминала
(если это
позволяет
используемое
оборудование)
из
структуры
termios, на
которую
указывает
termios_p. В optional_actions
задаётся,
когда
параметры
должны
начать
действовать:
- TCSANOW
- Изменения
начинают
действовать
немедленно.
- TCSADRAIN
- Изменения
начинают
действовать
после того,
как
переданы
все данные
для вывода,
записанные
в fd. Это
действие
должно
использоваться
при работе
с
параметрами,
которые
влияют на
вывод.
- TCSAFLUSH
- Изменения
начинают
действовать
после того,
как все
данные,
записанные
в объект,
на который
указывает
fd, были
переданы, и
все данные,
которые
были
приняты, но
не
прочитаны,
были
отброшены.
Канонический
и
неканонический
режим
Флагом ICANON
в c_lflag
определяется,
в каком
режиме
работает
терминал: в
каноническом
режиме (ICANON
установлен),
и
неканоническом
(ICANON не
установлен).
По
умолчанию
ICANON
установлен.
В
каноническом
режиме:
- Вводимые
данные
становятся
доступны
построчно.
Входная
строка
становится
доступна
после
набора
одного из
разделителей
строк (NL, EOL, EOL2
или EOF в
начале
строки). За
исключением
EOF,
разделитель
строк
добавляется
в буфер,
возвращаемый
read(2).
- Включено
редактирование
строки (ERASE, KILL; и,
если
указан
флаг IEXTEN — WERASE, REPRINT,
LNEXT). Вызов read(2)
возвращает
не более
одной
строки
ввода; если
read(2)
запрашивает
меньше
байт, чем
доступно в
текущей
вводимой
строке, то
читается
только
количество
запрошенных
байт, а
оставшиеся
символы
будут
доступны
для
следующего
read(2).
- Максимальная
длина
строки - 4096
символов
(включая
завершающий
символ
перевода
строки);
строки
длиннее 4096
символов
будут
обрезаны.
После 4095
символов
обработка
ввода (то
есть
обработка
ISIG и ECHO*)
продолжится,
однако
любые
входящие
данные
после 4095
символов
до (но не
включая)
любого
завершающего
символа
новой
строки
будут
отбрасываться.
Благодаря
этому
терминал
всегда
сможет
принять
больше
входящих
данных до
тех пор,
пока не
появится
хотя бы
один
перевод
строки.
В
неканоническом
режиме
вводимые
данные
доступны
сразу (без
введённого
пользователем
символа
разделителя
строк),
обработка
ввода не
выполняется
и
редактирование
строки
выключено.
Буфер
чтения
принимает
только 4095
символов;
благодаря
этому, в
случае,
если режим
ввода
переключится
в
канонический,
резервируется
необходимое
место для
символа
новой
строки.
Настройками
MIN (c_cc[VMIN]) и TIME (c_cc[VTIME])
задаются
условия,
при
которых
выполняется
read(2); есть
четыре
варианта:
- MIN == 0, TIME == 0
(чтение
опросом (polling
read))
- Если
данные
доступны,
то read(2)
завершает
выполнение
сразу,
возвращая
меньшее
или
запрошенное
количество
байт. Если
данных нет,
то read(2)
возвращает
0.
- MIN > 0, TIME == 0
(блокирующее
чтение)
- Вызов read(2)
блокирует
выполнение,
пока не
будет
доступно MIN
байт, и
возвращает
не более
количества
запрашиваемых
байт.
- MIN == 0, TIME > 0
(чтение с
блокировкой
по времени
(read with timeout))
- В TIME
указывается
время
срабатывания
таймера в
десятых
долях
секунды.
Таймер
запускается
при вызове
read(2). Вызов read(2)
завершается,
когда не
менее
одного
байта
станет
доступно,
или когда
сработает
таймер.
Если
таймер
сработал, а
данных не
появилось,
то read(2)
возвращает
0. Если на
момент
вызова read(2)
данные уже
были, то
вызов
действует
так, как
если бы
данные
были
получены
сразу
после
вызова.
- MIN > 0, TIME > 0
(чтение с
блокировкой
по времени
между
байтами (read with
interbyte timeout))
- В TIME
указывается
время
срабатывания
таймера в
десятых
долях
секунды.
После того,
как первый
байт
станет
доступен,
таймер
перезапускается
после
каждого
полученного
байта.
Вызов read(2)
возвращает
результат
после
удовлетворения
любого из
следующих
условий:
- Было
получено MIN
байт.
- Истекло
время
межбайтового
таймера.
- Получено
запрошенное
read(2)
количество
байт (в POSIX нет
этого
условия
завершения,
и в
некоторых
реализациях
read(2) не
возвращает
управление
в этом
случае).
- Так как
таймер
запускается
только
после
приёма
начального
байта,
будет
прочитан,
как
минимум,
один байт.
Если на
момент
вызова read(2)
данные уже
были, то
вызов
действует
так, как
если бы
данные
были
получены
сразу
после
вызова.
В POSIX не
указано,
имеет ли
флаг
состояния
файла O_NONBLOCK
приоритет
над
настройками
MIN и TIME. Если O_NONBLOCK
установлен,
то read(2) в
неканоническом
режиме
может
вернуть
управление
сразу же,
независимо
от
настройки MIN
или TIME. Более
того, если
данных нет,
то в POSIX
разрешено
read(2) в
неканоническом
режиме
вернуть
или 0, или -1 с
установкой
errno равной
EAGAIN.
Режим без
обработки
Функция
cfmakeraw()
переводит
терминал в
нечто
похожее на
режим «raw»
старого
драйвера
терминала
Version 7: ввод
доступен
символ за
символом,
эхо
отключено
и все
специальные
обработки
символов
при вводе и
выводе
также
отключены.
Задаются
следующие
атрибуты
терминала:
termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
termios_p->c_cflag &= ~(CSIZE | PARENB);
termios_p->c_cflag |= CS8;
Управление
линией
Функция
tcsendbreak()
передаёт
непрерывный
поток
нулевых
битов в
течение
заданного
промежутка
времени,
если
терминал
использует
асинхронную
передачу
данных.
Если duration
равно нулю,
то нулевые
биты
передаются,
по меньшей
мере, в
течение 0.25
секунды, но
не более 0.5
секунды.
Если duration не
равно нулю,
то нулевые
биты
посылаются
в течении
некоторого
периода
времени,
зависящего
от
реализации.
Если
терминал
не
использует
асинхронную
передачу
данных, то
tcsendbreak()
заканчивает
работу, не
предпринимая
каких-либо
действий.
Функция
tcdrain() ждёт,
пока все
данные
вывода,
записанные
в объект, на
который
ссылается
fd, не будут
переданы.
Функция
tcflush()
отбрасывает
(discards) данные,
записанные,
но не
переданные
в объект, на
который
ссылается
fd, или
принятые,
но не
прочитанные
(в
зависимости
от
значения
queue_selector):
- TCIFLUSH
- Отбросить
принятые,
но не
прочитанные
данные.
- TCOFLUSH
- Отбросить
записанные,
но не
переданные
данные.
- TCIOFLUSH
- Отбросить
принятые,
но не
прочитанные
данные и
записанные,
но не
переданные
данные.
Функция
tcflow()
задерживает
передачу
или приём
данных
объектом,
на который
ссылается
fd (в
зависимости
от
значения
action):
- TCOOFF
- Задержать
вывод.
- TCOON
- Возобновить
задержанный
вывод.
- TCIOFF
- Передать
символ STOP,
который
останавливает
передачу
данных в
систему с
устройства
терминала.
- TCION
- Передать
символ START,
который
начинает
передачу
данных в
систему с
устройства
терминала.
По
умолчанию
при
открытии
файла
терминала
ни ввод, ни
вывод не
приостановлены.
Скорость
линии
Функции
работы со
скоростью
передачи (в
бодах)
предназначены
для
получения
и
установки
значений
скоростей
ввода и
вывода в
структуре
termios. Новые
значения
не
действуют,
пока не
будет
вызвана
tcsetattr().
При
установке
скорости B0
модему
передаётся
команда
«повесить
трубку».
Фактическая
скорость,
соответствующая
B38400, может
быть
изменена с
помощью
setserial(8).
Скорости
ввода и
вывода
хранятся в
структуре
termios.
Функция
cfgetospeed()
возвращает
скорость
вывода
данных,
хранящуюся
в
структуре
termios, на
которую
указывает
termios_p.
Функция
cfsetospeed()
устанавливает
скорость
вывода
данных из
поля speed
структуры
termios, на
которую
указывает
termios_p.
Значение
должно
быть равно
одной из
следующих
констант:
B0
B50
B75
B110
B134
B150
B200
B300
B600
B1200
B1800
B2400
B4800
B9600
B19200
B38400
B57600
B115200
B230400
Нулевая
скорость, B0,
используется
для
завершения
соединения.
Если
указана B0,
то линии
управления
модемом не
должны
больше
отслеживаться.
Обычно это
обрывает
связь на
линии. CBAUDEX —
это маска
скоростей,
которые
выше
определённых
в POSIX.1 (57600 и выше).
Таким
образом, B57600
& CBAUDEX не
равно
нулю.
Функция
cfgetispeed()
возвращает
скорость
ввода
данных,
хранящуюся
в
структуре
termios.
Функция
cfsetispeed()
устанавливает
значение
скорости
ввода
данных из
поля speed
структуры
termios.
Значение
должно
быть равно
одной из
констант
Bnnn,
перечисленных
выше для
cfsetospeed(). Если
скорость
ввода
данных
устанавливается
равной
нулю, то
скорость
ввода
данных
будет
равна
скорости
вывода
данных.
Функция
cfsetspeed()
является
расширением
4.4BSD. Она имеет
те же
аргументы
что и cfsetispeed(), и
задаёт
сразу
скорость и
ввода и
вывода.
ВОЗВРАЩАЕМОЕ
ЗНАЧЕНИЕ
Функция
cfgetispeed()
возвращает
скорость
ввода
данных,
хранящуюся
в
структуре
termios.
Функция
cfgetospeed()
возвращает
скорость
вывода
данных,
хранящуюся
в
структуре
termios.
Все
остальные
функции
возвращают:
- 0
- при
успешном
выполнении.
- -1
- при
ошибках и
errno
присваивается
код
ошибки.
Заметим,
что tcsetattr()
завершается
без ошибок,
если
любое
запрошенное
изменение
было
успешно
выполнено.
Поэтому,
при
одновременном
изменении
нескольких
параметров,
может
понадобиться
вызвать tcgetattr()
для того,
чтобы
убедиться,
что все
изменения
были
выполнены.
АТРИБУТЫ
Описание
терминов
данного
раздела
смотрите в
attributes(7).
Интерфейс |
Атрибут |
Значение |
tcgetattr(), tcsetattr(), tcdrain(),
tcflush(), tcflow(), tcsendbreak(),
cfmakeraw(), cfgetispeed(), cfgetospeed(),
cfsetispeed(), cfsetospeed(), cfsetspeed() |
Безвредность
в нитях |
MT-Safe |
СООТВЕТСТВИЕ
СТАНДАРТАМ
Функции
tcgetattr(), tcsetattr(), tcsendbreak(),
tcdrain(), tcflush(), tcflow(), cfgetispeed(),
cfgetospeed(), cfsetispeed() и cfsetospeed()
определены
в POSIX.1-2001.
Функций
cfmakeraw() и cfsetspeed() нет
в
стандарте,
но есть в BSD.
ЗАМЕЧАНИЯ
В UNIX V7, а
также в
некоторых
более
новых
системах,
имеется
список
скоростей
в бодах, где
после
первых
четырнадцати
значений B0,
…, B9600, идут две
константы
EXTA и EXTB («External A» и «External
B»). Многие
другие
системы
расширяют
этот
список
более
высокими
значениями
скоростей.
Ненулевое
значение
duration с tcsendbreak()
приводит к
неизвестному
результату.
В SunOS задана
пауза duration * N
секунд, где N
равно не
менее 0.25, и не
более 0.5. В Linux, AIX, DU, Tru64
делается
пауза в duration
миллисекунд.
В FreeBSD и NetBSD и HP-UX и MacOS
значение
duration
игнорируется.
В Solaris и UnixWare
функция
tcsendbreak() с
ненулевым
duration
работает
аналогично
tcdrain().
ДЕФЕКТЫ
На
архитектуре
Alpha до Linux 4.16 (и glibc до
версии 2.28),
значение
XTABS
отличалось
от TAB3 и в
результате
игнорировалось
кодом
протокола
линии N_TTY в
драйвере
терминала
(так как он
не являлся
частью
маски TABDLY).