Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

Обратите внимание, что

TCIOFF
и
TCION
необязательны, и даже если второй конец соединения принимает их на обработку, перед этим может возникнуть задержка.

16.5.2. Размеры окна

Существуют два запроса

ioctl
, которые, к сожалению, не были закодированы как часть интерфейса
termios
, хотя и должны были. Размер tty, измеряемый строками и столбцами, должен управляться
tcgetwinsize
и
tcsetwinsize
, но, поскольку они не существуют, вместо этого следует использовать
ioctl
. Для запроса текущего размера и установки нового размера применяйте структуру
struct winsize
.

#include <termios.h>

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
для запроса нового размера и внесите в свою программу все необходимые изменения.

16.5.3. Флаги

Четыре флаговых переменных —

c_iflag
,
с_oflag
,
c_cflag
и
c_lflag
— хранят флаги, управляющие определенными характеристиками. Заголовочный файл
<termios.h>
предоставляет символические константы битовых масок, которые, в свою очередь, предоставляют эти флаги. Устанавливайте их с помощью
|=
и переустанавливайте с помощью
&=
и как показано ниже.

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

Также упоминаются области, представляющие особые проблемы переносимости, поэтому мы рассмотрим некоторые подробности функционирования других систем.

16.5.4. Флаги режима ввода

Флаги режима ввода влияют на обработку входных данных, хотя иногда они влияют и на выходные данные. Флаги, устанавливаемые в

с_iflag
, описаны ниже.

BRKINT
и
IGNBRK
При установке
IGNBRK
состояние разрыва игнорируется (см. описанную ранее
tcsendbreak
). Если
IGNBRK
не установлен, а
BRKINT
установлен, состояние разрыва заставляет tty сбросить все очередизованные входные и выходные данные и послать сигнал
SIGINT
процессам в группе процессов переднего плана для tty. Если
IGNBRK
и
BRKINT
не установлены, состояние разрыва читается как нулевой символ (
'\0'
), кроме случая установки
PARMRK
, в котором обнаруживается ошибка кадрирования и вместо этого в приложение передаются три байта
'\377' '\0' '\0'
.
PARMRK
и
IGNPAR
При установке
IGNPAR
полученные байты, содержащие ошибки четности или кадрирования, игнорируются (кроме того, что было ранее определено для состояния разрыва). Если
IGNPAR
не установлен, а
PARMRK
установлен, полученный байт с ошибкой четности или кадрирования передается приложению как трехбайтовая последовательность
'\377' '\0' '\n'
, где
n
— это байт в виде, в котором он был получен. В этом случае, если
ISTRIP
не установлен, допустимый символ
'\377'
передается приложению как последовательность двух символов
'\377' '\377'
; при установке
ISTRIP
старший разряд символа
'\377'
разделяется и передается как
'\177'
. Если не установлены ни
PARMRK
, ни
IGNPAR
, полученный байт с ошибкой четности или кадрирования (отличной от состояния разрыва) передается приложению как отдельный символ
'\0'
.
INPCK
При установке
INPCK
включается проверка четности. Если она не включается,
PARMRK
и
IGNPAR
не влияют на полученные ошибки четности.
ISTRIP
При установке
ISTRIP
старший разряд отсекается из всех полученных байтов, ограничивая их семью битами.
INLCR
При установке
INLCR
полученные символы новой строки ('\n') преобразуются в
символы возврата каретки (
'\r'
).
IGNCR
При установке
IGNCR
полученные символы возврата каретки (
'\r'
) игнорируются (не передаются приложению).
ICRNL
Если установлен
ICRNL
, а
IGNCR
не установлен, полученные символы возврата каретки (
'\r'
) сообщаются приложению как символы новой строки (
'\n'
).
IUCLC
При установке
IUCLC
и
IEXTEN
полученные символы верхнего регистра передаются приложению как символы нижнего регистра. Этот флаг в POSIX не определен.
IXOFF
При установке
IXOFF
tty может передать символы Control-S и Control-Q терминалу, чтобы заставить его, соответственно, остановиться и восстановить вывод (то есть передачу данных на компьютер) с целью переполнения входных буферов tty. Это имеет отношение только к последовательным терминалам, поскольку сетевые и локальные терминалы имеют более прямые формы управления потоком. Даже последовательные терминалы часто поддерживают аппаратное управление потоком, контролируемое управляющим флагом (
c_cflag
) и делающее неуместным программное управление потоком (Control-S и Control-Q).
IXON
При установке
IXON
принятый символ Control-S прекращает передачу входных данных в этот tty, а принятый символ Control-Q перезапускает передачу выходных данных в этот tty. Это соответствует любой форме терминального ввода-вывода, поскольку некоторые пользователи вводят буквенные символы Control-S и Control-Q для приостановки и восстановления вывода.
IXANY
При установке
IXANY
любой принятый символ (не просто Control-Q) перезапускает передачу выходных данных. Этот флаг в POSIX не определен.
IMAXBEL
При установке
IMAXBEL
предупреждающий символ (
'\а'
) передается тогда, когда символ принимается, а входной буфер уже полон. Этот флаг в POSIX не определен.

16.5.5. Флаги режима вывода

Флаги режима вывода модифицируют обработку выходных данных только в случае установки

OPOST
. Ни один из этих флагов не переносим, поскольку POSIX определяет только
OPOST
и называет его "реализация определена". Однако вы обнаружите, что настоящие приложения обработки терминалов часто нуждаются в обработке выходных данных, а флаги режима вывода, доступные в Linux, доступны также в большинстве систем Unix, включая SVR4.

Код терминала отслеживает текущий столбец, что позволяет подавить лишние символы возврата каретки (

'\r'
) и преобразовать, где возможно, табуляцию в пробелы. Столбцы отсчитываются, начиная с нуля. Текущий столбец устанавливается в ноль всякий раз, когда передается или предполагается символ возврата каретки (
'\r'
), как может быть вызвано символом новой строки (
'\n'
) при установке
ONLRET
или
ONLCR
, или когда текущий столбец установлен в единицу и передается символ забоя (
'\b'
).

Флаги, работающие на

с_oflag
, перечислены ниже.

OPOST
Это единственный флаг режима вывода, определенный в POSIX, который сообщает, что он включает обработку выходных данных, "определяемую реализацией". Если
OPOST
не установлен, к другим флагам режима вывода не обращаются и обработка выходных данных не выполняется.
OLCUC
При установке
OLCUC
символы нижнего регистра передаются терминалу как символы верхнего регистра. Этот флаг в POSIX не определен.
ONLCR
При установке
ONLCR
перед передачей символа новой строки (
'\n'
) передается символ возврата каретки (
'\r'
). Текущий столбец устанавливается в ноль. Этот флаг в POSIX не определен.
ONOCR
При установке
ONOCR
символы возврата каретки (
'\r'
) ни обрабатываются, ни передаются, если текущий столбец равен нулю. Этот флаг в POSIX не определен.
OCRNL
При установке
OCRNL
символы возврата каретки (
'\r'
) преобразуются в символы новой строки (
'\n'
). При установке
ONLRET
текущий столбец устанавливается в ноль. Этот флаг в POSIX не определен.
ONLRET
При установке
ONLRET
во время передачи символа новой строки (
'\n'
) или возврата каретки (
'\r'
) текущий столбец устанавливается в ноль. Этот флаг в POSIX не определен.
OXTABS
При установке
OXTABS
символы табуляции преобразуются в пробелы. Позиции табуляции установлены после каждого восьмого символа, а количество передаваемых пробелов определяется текущим столбцом. Этот флаг в POSIX не определен.
Поделиться:
Популярные книги

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Саженец

Ланцов Михаил Алексеевич
3. Хозяин дубравы
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Саженец

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Инвестиго, из медика в маги 2

Рэд Илья
2. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги 2

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2