int tcsendbreak(int fd, int duration)
Посылает поток нулей в fd
, чтобы узнать определенную длительность ( duration
), которая также известна как разрыв. Если duration
равняется 0, разрыв длится не менее 250 и не более 500 миллисекунд. К сожалению, POSIX не определяет элемент, длительность которого измеряется, поэтому единственной переносимой величиной для duration
является 0
. В Linux длительность увеличивает разрыв; 0
или 1
задают длительность между четвертью секунды и полсекунды; 2
— между полсекунды и секундой и так далее.
int tcdrain(int fd)
Ожидает, пока не передадутся все входные данные, ожидающие в данный момент на файловом дескрипторе fd
.
int tcflush(int fd, int queue_selector)
Отбрасывает некоторые данные в файловом дескрипторе fd
в зависимости от величины queue_selector
.
TCIFLUSH |
Сбрасывает на диск все полученные, но еще не прочитанные интерфейсом данные. |
TCOFLUSH |
Сбрасывает на диск все данные, записанные в интерфейс, но еще не отправленные. |
TCIOFLUSH |
Сбрасывает на диск все ожидающие входные и выходные данные. |
int tcflow(int fd, int action)
Приостановить или возобновить вывод или ввод в файловом дескрипторе fd
. Более точные действия определяются action
.
TCOOFF |
Приостановить вывод. |
TCOON |
Восстановить вывод. |
TCIOFF |
Передать символ STOP, запрашивающий прекращение передачи символов вторым концом соединения. |
TCION |
Передать символ START, запрашивающий восстановление передачи символов вторым концом соединения. |
Обратите внимание, что TCIOFF
и TCION
необязательны, и даже если второй конец соединения принимает их на обработку, перед этим может возникнуть задержка.
Существуют два запроса ioctl()
, которые, к сожалению, не были закодированы как часть интерфейса termios
, хотя и должны были. Размер tty, измеряемый строками и столбцами, должен управляться tcgetwinsize()
и tcsetwinsize()
, но, поскольку они не существуют, вместо этого следует использовать ioctl()
. Для запроса текущего размера и установки нового размера применяйте структуру struct winsize
.
#include
struct winsize {
unsigned short ws_row; /* количество строк */
unsigned short ws_col; /* количество столбцов */
unsigned short ws_xpixel; /* не используется */
unsigned short ws_ypixel; /* не используется */
};
Для запроса текущего размера используйте следующий вызов:
struct winsize ws;
ioctl(fd, TIOCGWINSZ, &ws);
Для установки нового размера заполните struct winsize
и предусмотрите такой вызов:
ioctl(fd, TIOCSWINSZ, &ws);
В конце этой главы представлен пример условий, при которых возникает потребность в установке нового размера окна.
При изменении размеров окна лидеру группы процессов переднего плана на данном tty передается сигнал SIGWINCH
. Ваш код может перехватить этот сигнал; используйте TIOCGWINSZ
для запроса нового размера и внесите в свою программу все необходимые изменения.
Четыре флаговых переменных — c_iflag
, с_oflag
, c_cflag
и c_lflag
— хранят флаги, управляющие определенными характеристиками. Заголовочный файл предоставляет символические константы битовых масок, которые, в свою очередь, предоставляют эти флаги. Устанавливайте их с помощью |=
и переустанавливайте с помощью &=
и как показано ниже.
t.c_iflag |= BRKINT;
t.c_iflag &= ~IGNBRK;
Некоторые из этих символических определений в действительности являются битовыми масками, охватывающими несколько взаимозависимых констант. Они используются с целью извлечения частей структуры для сравнения:
if ((t.c_cflag & CSIZE) == CS7) character_size = 7;
Набор флагов меняется от системы к системе. Наиболее важные флаги определены POSIX, но Linux, как и System V, включает несколько полезных флагов, не описанных в POSIX. Эта документация неполная; Linux поддерживает флаги, которые вряд ли понадобятся. Будут рассмотрены только те флаги, которые будут нужны наверняка.
Чтобы предоставить возможность создавать переносимое программное обеспечение, мы пометили каждый флаг, не определенный стандартом POSIX. Для таких флагов потребуется писать такой код:
#ifdef IUCLC
t.c_iflag |= IUCLC;
#endif
Также упоминаются области, представляющие особые проблемы переносимости, поэтому мы рассмотрим некоторые подробности функционирования других систем.
Читать дальше