Функции tcsendbreak(), tcdrain(), tcflush() и tcflow() выполняют действия, которые можно объединить под общим названием
#include
int tcsendbreak(int
int tcdrain(int
int tcflush(int
int tcflow(int
Все возвращают 0 при успешном завершении или -1 при ошибке
В каждой из этих функций fd является файловым дескриптором, ссылающимся на терминал или другое удаленное устройство, подключенное к последовательному порту.
Функция tcsendbreak() генерирует условие BREAK, безостановочно передавая поток нулевых битов. Аргумент duration обозначает длину передачи. Допустим, он равен 0, тогда нулевые биты будут передаваться на протяжении 0,25 секунды (стандарт SUSv3 ограничивает продолжительность в пределах от 0,25 до 0,5 секунды). Если duration больше 0, то нулевые биты станут передаваться на протяжении заданного количества миллисекунд. Этот случай не предусмотрен стандартом SUSv3; обработка ненулевых значений duration сильно варьируется в зависимости от реализации (детали, описанные здесь, актуальны для библиотеки glibc).
Функция tcdrain() блокируется, пока не будет передан весь вывод (то есть пока не опустеет исходящая очередь терминала).
Функция tcflush() сбрасывает (отклоняет) данные во входящей и/или исходящей очереди терминала (см. рис. 58.1). Сброс входящей очереди приводит к потере данных, которые уже дошли до драйвера терминала, но еще не были прочитаны ни одним процессом. Например, приложение может использовать tcflush() для отмены всех запоздалых символов, прежде чем предложить ввести пароль. Сброс исходящей очереди отклоняет все данные, которые уже были записаны (переданы драйверу терминала), но еще не переданы устройству. Аргумент queue_selector может принимать одно из значений, описанных в табл. 58.4.
Стоит отметить, что термин «сброс» в контексте функции tcflush() имеет другое значение, чем в случае с файловым вводом/выводом. При работе с файлами «сбросить» означает принудительно записать вывод в пользовательский сегмент памяти или буферный кэш (если речь идет о вызове fflush()) либо же переместить данные из буферного кэша на диск, как при использовании вызовов fsync(), fdatasync() и sync().
Таблица 58.4. Значения аргумента queue_selector для функции tcflush()
Значение — Описание
TCIFLUSH — Сбрасывает входящую очередь
TCOFLUSH — Сбрасывает исходящую очередь
TCIOFLUSH — Сбрасывает входящую и исходящую очереди
Функция tcflow() управляет потоком данных, передающихся между компьютером и терминалом (или другим удаленным устройством) в любом направлении. Аргумент action принимает одно из значений, перечисленных в табл. 58.5. Константы TCIOFF и TCION действуют только в терминалах, способных интерпретировать символы STOP и START; они приводят к приостановке и, соответственно, возобновлению передачи данных компьютеру.
Таблица 58.5. Значения аргумента action для функции tcflush()
Значение — Описание
TCOOFF — Приостанавливает вывод в терминал
TCOON — Возобновляет вывод в терминал
TCIOFF — Передает терминалу символ STOP
TCION — Передает терминалу символ START
В оконной среде приложения, работающие с экраном, должны уметь отслеживать размер окна терминала, чтобы в случае его изменения иметь возможность перерисовать свой вывод. Для этого ядро предоставляет два инструмента.
• После изменения размера окна терминала активной группе процессов отправляется сигнал SIGWINCH. По умолчанию он игнорируется.
• В любой момент (обычно после получения сигнала SIGWINCH) процесс может использовать вызов ioctl() с флагом TIOCGWINSZ, чтобы получить текущий размер окна терминала.
Вызов ioctl() с флагом TIOCGWINSZ применяется следующим образом:
if (ioctl(fd, TIOCGWINSZ, &ws) == -1)
errExit("ioctl");
Аргумент fd является файловым дескриптором, ссылающимся на окно терминала. Последний аргумент вызова ioctl() представляет собой указатель на структуру winsize (определена в заголовочном файле
struct winsize {
unsigned short ws_row; /* Количество строк (в символах) */
unsigned short ws_col; /* Количество столбцов (в символах) */
unsigned short ws_xpixel; /* Ширина (в пикселах) */
unsigned short ws_ypixel; /* Высота (в пикселах) */
};
Как и многие другие системы, Linux не задействует поля структуры winsize с пиксельными размерами.
Использование сигнала SIGWINCH в сочетании с операцией ioctl() TIOCGWINSZ демонстрируется в листинге 58.5. Ниже показан пример того, что можно увидеть при запуске этой программы в среде с оконным менеджером и изменении размера окна терминала три раза подряд: