cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed - получение
и изменение атрибутов терминала, управление последовательным портом,
определение и изменение скорости обмена информацией
int tcsetattr(int fd, int optional_actions, 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);
int cfmakeraw(struct termios *termios_p);
speed_t cfgetispeed(struct termios *termios_p);
speed_t cfgetospeed(struct termios *termios_p);
int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
ОПИСАНИЕ
Функции termios описывают общий терминальный интерфейс,
гарантирующий управление асинхронным коммуникационным портом.
Большинство функций, описанных здесь, используют параметр termios_p,
который указывает на структуру termios.
Данная структура содержит, как минимум, следующие элементы:
если включен IGNBRK то BREAK игнорируется. Если он не включен,
а BRKINT включен, то BREAK вызывает сброс очередей, и, если
терминал является управляющим для группы процессов переднего плана, то
группе будет отослан сигнал SIGINT. Если ни IGNBRK ни BRKINT
не включены, то BREAK считывается как нулевой символ, кроме случая
когда установлено PARMRK, тогда он будет считан, как
последовательность \377 \0 \0.
IGNPAR
игнорировать ошибки четности и позиционирования.
PARMRK
если не включен режим IGNPAR, то сопровождать
символ с ошибкой четности или позиционирования префиксом \377 \0.
Если не включен ни IGNPAR, ни PARMRK,
то считывать символ с ошибкой четности или позиционирования как \0.
INPCK
запускать проверку четности при вводе.
ISTRIP
удалять восьмой бит.
INLCR
преобразовывать NL в CR при вводе.
IGNCR
игнорировать перевод каретки при вводе.
ICRNL
преобразовывать перевод каретки в конец строки при вводе
(пока не будет запущен IGNCR).
IUCLC
(не включено в POSIX) отображать символы верхнего регистра в нижнем
регистре при вводе.
IXON
запустить управление потоком данных XON/XOFF при выводе.
IXANY
(не включено в POSIX.1; XSI) позволить любому символу заново
запускать вывод.
IXOFF
запустить управление потоком данных XON/XOFF при вводе.
IMAXBEL
(не включено в POSIX) выдавать звуковой сигнал, когда очередь
ввода переполнится.
Linux не использует этот бит и действует так. будто он всегда включен.
Константы для флага c_oflag, включенные в POSIX.1:
OPOST
включить режим вывода, определяемый реализацией по умолчанию.
Остальные константы для флага c_oflag определены в
POSIX 1003.1-2001 (если явно не указано иначе).
OLCUC
(не включено в POSIX)
отображать символы нижнего регистра в верхнем регистре при выводе.
ONLCR
(XSI) преобразовывать NL в CR-NL при выводе.
OCRNL
преобразовывать CR в NL при выводе.
ONOCR
не выводить CR в столбце 0.
ONLRET
не выводить CR.
OFILL
посылать символы заполнения для задержки, а не использовать
синхронизированную задержку.
OFDEL
(не включено в POSIX) установить символ заполнения ASCII DEL (0177).
Иначе установить символ заполнения ASCII NUL.
NLDLY
маска задержки конца строки. Значениями будут NL0 и NL1.
маска задержки горизонтальной табуляции.
Значениями будут: TAB0, TAB1, TAB2, TAB3 (или XTABS).
Значение TAB3 или, иначе, XTABS "расширяет" табуляцию в пробелы
(с символами табуляции в каждой восьмой позиции).
BSDLY
маска задержки символа забоя.
Значением будет BS0 или BS1.
(Никогда не была реализована.)
VTDLY
маска задержки вертикальной табуляции.
Значением будет VT0 или VT1.
FFDLY
маска задержки прокрутки страницы.
Значением будет FF0 или FF1.
Константы для флага c_cflag:
CBAUD
(не включено в POSIX) маска скорости в бодах (4+1 бита).
CBAUDEX
(не включено в POSIX) дополнительная маска скорости в бодах
(1 бит), включена в CBAUD.
(В стандарте 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.)
CIBAUD
(не включено в POSIX) маска для скоростей ввода. Для битов CIBAUD
используются те же значения, что и для битов CBAUD, но они смещены
влево на ISHIFT битов.
CRTSCTS
(не включено в POSIX) разрешить управление потоком данных RTS/CTS
(аппаратное).
Константы для флага c_lflag:
ISIG
когда принимаются любые символы из INTR, QUIT, SUSP или DSUSP,
то генерировать соответствующий сигнал.
ICANON
запустить канонический режим. Это означает, что линии используют специальные
символы: EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, STATUS и WERASE,
а также строчную буферизацию.
XCASE
(не включено в POSIX; не поддерживается в Linux)
если при этом запущен ICANON, то терминал работает только
с символами в верхнем регистре. Все вводимое конвертируется в символы нижнего
регистра, кроме символов, предваряемых \.
При выводе предваряемые \ символы в верхнем регистре и символы в нижнем
регистре преобразуются в символы вернего регистра.
ECHO
отображать вводимые символы.
ECHOE
если запущен ICANON, то символ ERASE удалает предыдущий символ,
а WERASE удаляет предыдущее слово.
ECHOK
если запущен ICANON, то символ KILL удаляет всю текущую строку.
ECHONL
если запущен ICANON, то символ NL отображается,
даже если режим ECHO не включен.
ECHOCTL
(не включено в POSIX)
если запущен ECHO, то управляющие сигналы ASCII, отличающиеся от TAB, NL,
START и STOP, отображаются как ^X, где X есть символ из таблицы ASCII с кодом
на 0x40 больше, чем у управляющего сигнала. Например, символ 0x08 (BS)
отобразится как ^H.
ECHOPRT
(не включено в POSIX)
если включены ICANON и IECHO, то символы печатаются по мере того,
как они уничтожаются.
ECHOKE
(не включено в POSIX)
если ICANON также включен, то KILL обозначается как
уничтожение каждого символа в строке
(по спецификации ECHOE и ECHOPRT).
DEFECHO
(не включено в POSIX)
выводить только когда процесс считывает.
FLUSHO
(не включено в POSIX; не поддерживается в Linux)
выводимые данные ускоренно записываются. Этот флаг
переключается с помощью набираемого символа DISCARD.
NOFLSH
отключить ускоренную запись вводимых и выводимых очередей во время
генерации сигналов SIGINT и SIGQUIT и записывать вводимую очередь
при генерации сигнала SIGSUSP.
TOSTOP
послать сигнал SIGTTOU процессной группе фонового процесса, которая
делает попытку записать его на контролирующий терминал.
PENDIN
(не включено в POSIX; не поддерживается в Linux)
все символы в очереди ввода повторно печатаются, когда считан последующий
символ (таким образом bash "перехватывает" предваряющую печать).
IEXTEN
включить режим ввода, определяемый реализацией по умолчанию.
Этот флаг, как и ICANON должен быть включен для обработки
специальных символов EOL2, LNEXT, REPRINT, WERASE, а также
для того, чтобы работал флаг IUCLC.
Массив c_cc определяет специальные управляющие символы.
Символьные индексы (что означают: начальное значение):
VINTR
(003, ETX, Ctrl-C, а также 0177, DEL, rubout)
Символ прерывания. Посылает сигнал SIGINT.
Распознается если установлен ISIG, и, в этом случае, далее не пропускается.
VQUIT
(034, FS, Ctrl-\)
Символ завершения. Посылает сигнал SIGQUIT.
Распознается если установлен ISIG, и, в этом случае, далее не пропускается.
VERASE
(0177, DEL, rubout, или 010, BS, Ctrl-H, или также #)
Символ забоя. Стирает предыдущий еще-не-стертый символ, но не
стирает за EOF или началом строки.
Распознается если установлен ICANON, и, в этом случае, далее не пропускается.
VKILL
(025, NAK, Ctrl-U, или Ctrl-X, а также @)
Символ уничтожения. Стирает ввод с последнего EOF или начала строки.
Распознается если установлен ICANON, и, в этом случае, далее не пропускается.
VEOF
(004, EOT, Ctrl-D)
Символ конца файла.
Если более точно, то этот символ заставляет переслать буфер tty
ожидающей программе пользователя без ожидания конца строки.
Если это первый символ в строке, то read() вернет программе 0,
что означает конец файла.
Распознается если установлен ICANON, и, в этом случае, далее не пропускается.
VMIN
Минимальное количество символов для неканонического ввода.
VEOL
(0, NUL)
Дополнительный символ конца строки.
Распознается если установлен ICANON.
VTIME
Время ожидания в децисекундах для неканонического ввода.
VEOL2
(не включено в POSIX; 0, NUL)
Еще один символ конца строки.
Распознается если установлен ICANON.
VSWTCH
(не включено в POSIX; не поддерживается в Linux; 0, NUL)
Символ переключения. (Используется только shl.)
VSTART
(021, DC1, Ctrl-Q)
Символ запуска. Перезапускает вывод, остановленный символом останова.
Распознается когда установлен IXON и, в этом случае, далее не пропускается.
VSTOP
(023, DC3, Ctrl-S)
Символ останова. Приостанавливает вывод до появления символа запуска.
Распознается когда установлен IXON и, в этом случае, далее не пропускается.
VSUSP
(032, SUB, Ctrl-Z)
Символ приостанова. Посылает сигнал SIGTSTP.
Распознается когда установлен ISIG и, в этом случае, далее не пропускается.
VDSUSP
(не включен в POSIX; не поддерживается в Linux; 031, EM, Ctrl-Y)
Символ отложенного приостанова: посылает сигнал SIGTSTP при считывании
символа программой пользователя.
Распознается когда установлены IEXTEN и ISIG, и система поддерживает
управление заданиями. В этом случае далее не пропускается.
VLNEXT
(не включено в POSIX; 026, SYN, Ctrl-V)
Следующий символ - литера. Экранирует следующий символ, отменяя его
возможное специальное значение.
Распознается когда установлены IEXTEN и, в этом случае далее не пропускается.
VWERASE
(не включено в POSIX; 027, ETB, Ctrl-W)
Стирание слова.
Распознается когда установлены ICANON и IEXTEN и, в этом случае далее не пропускается.
VREPRINT
(не включено в POSIX; 022, DC2, Ctrl-R)
Вывести заново несчитанные символы.
Распознается когда установлены ICANON и IEXTEN и, в этом случае далее не пропускается.
VDISCARD
(не включено в POSIX; не поддерживается в Linux; 017, SI, Ctrl-O)
Начать/остановить отбрасывание ожидающего вывода.
Распознается когда установлены IEXTEN и, в этом случае далее не пропускается.
VSTATUS
(не включено в POSIX; не поддерживается в Linux;
запрос состояния: 024, DC4, Ctrl-T).
Значения этих символов все различны, за исключением символов
VTIME, VMIN, которые могут иметь те же значения, что и VEOL, VEOF,
соответственно.
(В нестандартном режиме значение специальных символов заменяются
значениями по истечении времени ожидания. MIN представляет собой
минимальное число символов, которые должны быть получены при чтении.
TIME - десятые доли секунды таймера. Когда оба символа установлены,
чтение будет ожидать пока по меньшей мере один символ не будет получен,
и тогда возвращает либо MIN полученных символов, либо время TIME
прошедшее с момента получения последнего символа.
Если установлено только значение MIN, тогда операция чтение не будет
возвращаться пока не будет получено MIN количество символов.
Если установлено только значение TIME, то операция чтения будет возвращать
любой по крайней мере один полученный символ или произойдет истечение
времени ожидания. Если ничего не установлено, то
операция чтения немедленно завершается, и будут доступны только
уже принятые символы.
tcgetattr() :
получить параметры, связанные с объектом, на который ссылается fd,
и сохранить их в структуре termios, на которую ссылается termios_p.
Эта функция может быть запущена из фонового процесса;
однако, атрибуты терминала могут в дальнейшем
изменяться основным процессом.
tcsetattr():
меняет параметры, связанные с терминалом
(если требуется поддержка используемого оборудования,
которая недоступна), и параметры структуры termios, связанной с
termios_p. Для того, чтобы изменения вступили в силу, необходимо указать
optional_actions:
TCSANOW
изменения немедленно начинают работать.
TCSADRAIN
изменения заработают после того, как все данные для вывода и записи переданы в
fd.
Эта функция должна использоваться при работе с параметрами, которые
меняют работу устройств вывода данных и меняют выводимые данные.
TCSAFLUSH
изменения начинают работу после того, как на объект, на который указывает
fd,
были переданы все данные, предназначенные для вывода на запись; все данные,
которые были приняты (но не считаны),
будут отменены перед тем, как произошли изменения.
tcsendbreak()
передает непрерывный поток нулевых битов в течение
указанного промежутка времени,
если терминал использует асинхронную последовательность передачи данных.
Если duration равно нулю, то нулевые биты передаются,
по меньшей мере, в течение 0.25 секунд, но не более 0.5 секунды.
Если duration не равно нулю, то нулевые биты посылаются в
течении некоторого периода времени, зависящего от реализации.
Если терминал не использует асинхронную последовательную передачу данных,
то tcsendbreak() заканчивает работу, не предпринимая каких-либо действий.
tcdrain()
ждет, пока все данные вывода, записанные на объект, на который ссылается
fd,
не будут переданы.
tcflush():
отказывается от данных, записанных, но не переданных на объект, на который
ссылается
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()
устанавливает скорость вывода данных, сохраненную в структуре termios,
на которую указывает termios_p, в speed,
которая должна быть равна одной из следующих констант:
Нулевая скорость, B0,
используется для завершения связи. Если указано B0,
то линии управления модемом не должны больше быть утверждены.
В обычном случае это прекратит связь с линией.
CBAUDEX является маской скоростей, которые выше
определенных в POSIX.1 (57600 и выше).
Таким образом, B57600 и CBAUDEX не равны нулю.
cfgetispeed()
возвращает скорость ввода данных, сохраненную в структуре termios.
cfsetispeed()
устанавливает значение скорости ввода данных,
сохраненной в структуре termios, равное
speed.
Если скорость ввода данных меняется на ноль, то скорость ввода данных
будет равна скорости вывода данных.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
cfgetispeed()
возвращает скорость ввода данных, сохраненную в структуре termios.
cfgetospeed()
возвращает скорость вывода данных, сохраненную в структуре termios.
Все другие функции возвращают:
0
при нормальном завершении работы.
-1
при ошибках (при этом значение переменной
errno
меняется на значение, соответствующее ошибке).
Обратите внимание, что
tcsetattr()
сообщает об успешном завершении, если хотя бы одно из запрошенных
изменений может быть успешно выполнено. Поэтому, при необходимости одновременного
изменения нескольких параметров, может понадобится после этой функции вызвать
tcgetattr()
для того, чтобы убедиться, что все изменения были выполнены успешно.
ЗАМЕЧАНИЯ
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.