185
которые в стандарте POSIX введены в качестве замены исторически
сложившейся, универсальной, но чрезмерно эклектичной, не
вписывающейся ни в какие синтаксические рамки функции ioctl().
#include <termios.h>
int tcgetattr (int fildes, struct termios *termios_p);
int tcsetattr (int fildes, int optional_actions, const struct termios
*termios_p);
int tcflow (int fildes, int action);
int tcflush (int fildes, int queue_selector);
int tcdrain (int fildes);
int tcsendbreak (int fildes, int duration);
Листинг 9.7. Описание функций семейства tc*().
#include <termios.h>
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);
Листинг 9.8. Описание функций семейства cf*().
Пара функций tcgetattr()/tcsetattr() позволяет стандартным образом
опросить/изменить характеристики терминала, ассоциированного с
открытым файловым дескриптором fildes. Значения характеристик
помещаются в структуру, на которую указывает аргумент termios_p.
Нюансами изменения ведает аргумент optional_actions. Если его
значение равно TCSANOW, изменение выполняется немедленно.
Значение TCSADRAIN предписывает сначала дождаться передачи на
терминальное устройство всех записанных по дескриптору fildes
данных; это полезно, если изменения затрагивают режимы вывода.
Значение TCSAFLUSH дополнительно означает предварительный сброс
введенных устройством, но не прочитанных прикладными процессами
символов.
Отметим, что вызов tcsetattr() завершается успешно (и возвращает
нулевое значение), если удалось осуществить хотя бы одно из
запрошенных изменений характеристик терминала. Это сделано по
соображениям мобильности, поскольку разные реализации могут
поддерживать разные подмножества характеристик. После tcsetattr()
целесообразно снова вызвать tcgetattr() и узнать реальное состояние
терминального устройства.
Приложение, изменяющее характеристики терминала, обязано
позаботиться об их последующем восстановлении (например, при
завершении процесса). Завершение должно выполняться аккуратно, с
обработкой сигналов.
Функция tcflow() позволяет приостановить или возобновить
терминальный ввод/вывод. Если значение аргумента action равно
TCOOFF, приостанавливается вывод; по значению TCOON он
возобновляется. Значение TCIOFF вызывает передачу на терминал