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

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

Жанры

Разработка приложений в среде 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 не определен.
Поделиться:
Популярные книги

Искушение генерала драконов

Лунёва Мария
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Искушение генерала драконов

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Измена. Свадьба дракона

Белова Екатерина
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Измена. Свадьба дракона

Расческа для лысого

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
8.52
рейтинг книги
Расческа для лысого

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

Гром над Империей. Часть 2

Машуков Тимур
6. Гром над миром
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Гром над Империей. Часть 2

Князь

Шмаков Алексей Семенович
5. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
5.00
рейтинг книги
Князь

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Школа Семи Камней

Жгулёв Пётр Николаевич
10. Real-Rpg
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Школа Семи Камней

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Последний попаданец 5

Зубов Константин
5. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 5

Под маской моего мужа

Рам Янка
Любовные романы:
современные любовные романы
5.67
рейтинг книги
Под маской моего мужа