В последней строке сессии, представленной выше, видно: командная оболочка вывела свое приглашение в той же строке, что и символ q, который привел к выходу из программы.
Ниже показан пример использования режима cbreak:
$ ./test_tty_functions x
XYZ
[1]+ Stopped./test_tty_functions x
$ stty
speed 38400 baud; line = 0;
$ fg
./test_tty_functions x
***
$
$ stty
speed 38400 baud; line = 0;
Разные терминалы (и последовательные порты) имеют разную скорость отправки и приема данных (в битах в секунду). Функции cfgetispeed() и cfsetispeed() позволяют получить и изменить скорость ввода последовательного порта. Функции cfgetospeed() и cfsetospeed() отвечают за скорость вывода.
Термин «бод» (англ. baud) служит в качестве синонима скорости терминала (в битах в секунду), хотя формально он здесь не совсем уместен. В частности, бод измеряет скорость изменения сигнала в соединении, которая может не совпадать с количеством битов, передаваемых за секунду, ведь последняя зависит от способа кодирования битов в сигналы. Тем не менее этот термин продолжает использоваться в качестве единицы измерения скорости в битах в секунду. Чтобы избежать путаницы, будем применять термины «скорость терминала» или «скорость последовательного порта».
#include
speed_t cfgetispeed(const struct termios *
speed_t cfgetospeed(const struct termios *
Обе функции возвращают скорость из заданной структуры termios
int cfsetospeed(struct termios *
int cfsetispeed(struct termios *
Обе функции возвращают 0 при успешном завершении или -1 при ошибке
Каждая из этих функций работает со структурой termios, которая должна быть предварительно инициализирована с помощью вызова tcgetattr().
Например, чтобы получить текущую скорость вывода терминала, нужно сделать следующее:
struct termios tp;
speed_t rate;
if (tcgetattr(fd, &tp) == -1)
errExit("tcgetattr");
rate = cfgetospeed(&tp);
if (rate == -1)
errExit("cfgetospeed");
Если впоследствии понадобится изменить данную скорость, то можно сделать это следующим образом:
if (cfsetospeed(&tp, B38400) == -1)
errExit("cfsetospeed");
if (tcsetattr(fd, TCSAFLUSH, &tp) == -1)
errExit("tcsetattr");
Тип данных используется для хранения скорости последовательного порта. Скорость назначается не напрямую, а с помощью набора символьных констант (определенных в заголовочном файле
Стандарт SUSv3 гласит: скорость терминала хранится в структуре termios, но не уточняет, где именно (так делается намеренно). Многие системы, включая Linux, используют для этого поле c_cflag, где указываются маска CBAUD и флаг CBAUDEX (в разделе 58.2 отмечалось, что в Linux нестандартные поля c_ispeed и c_ospeed структуры termios не применяются).
Функции cfsetispeed() и cfsetospeed() позволяют указывать отдельные скорости для ввода и вывода, однако во многих терминалах данные значения должны совпадать. Кроме того, Linux использует только одно поле для хранения скорости терминала (то есть скорость всегда будет одной и той же). Это значит, что все функции для работы с входящей и исходящей скоростью терминала обращаются к одному и тому же полю структуры termios.
Передавая функции cfsetispeed() нулевой параметр speed, мы тем самым устанавливаем входящую скорость на уровне исходящей (когда вызывается tcsetattr()). Это бывает удобно в системах, где скорости ввода и вывода хранятся в виде одного значения.