Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

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 не определен.

Кроме того, существуют флаги задержки, которые устанавливать не нужно; они предназначены для компенсации старого, плохо спроектированного и на данный момент, к счастью, редко встречающегося оборудования. За управление флагами задержки ответственны библиотеки

termcap
и
terminfo
. Это означает, что в их модификации нет необходимости. В [37] они упомянуты как устаревшие. Ядро Linux не реализует их в данный момент, и, поскольку это свойство не пользуется спросом, они вряд ли будут реализованы в будущем.

16.5.6. Управляющие флаги

Флаги режима управления влияют на такие параметры протокола, как четность и управление потоком [114] . Флаги, устанавливаемые в

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

CLOCAL
При установке
CLOCAL
линии управления модемом игнорируются. Если он не установлен,
open
блокируется до тех пор, пока модем не объявит состояние ответа абонента, утвердив линию обнаружения несущей.
CREAD
Символы могут приниматься только в случае установки
CREAD
. Его сбрасывать не обязательно. (Примечание. Попробуйте запустить
stty -cread
.)
CSIZE
CSIZE
— это маска для кодов, устанавливающих размер передаваемого символа в битах. Размер символа следует установить в перечисленные ниже значения.
CS5
для пяти бит на символ;
CS6
для шести бит на символ;
CS7
для семи бит на символ;
CS8
для восьми бит на символ.
CSTOPB
При установке
CSTOPB
на конце каждого кадра символа генерируется по два стоповых бита. Если
CSTOPB
не установлен, генерируется лишь по одному стоповому биту. Устаревшее оборудование, требующее двух стоповых битов, встречается редко.
HUPCL
Если установлен, то при закрытии последнего открытого файлового дескриптора на устройстве уровень на линиях последовательного порта DTR и RTS (если они существуют) будет снижен, чтобы заставить модем разорвать соединение. То есть, например, если пользователь, вошедший в систему через модем, затем выходит из нее, модем разрывает соединение. Если программа передачи данных открывает устройство для исходящих вызовов, а процесс затем закрывает устройство (или завершается), модем разорвет соединение.
PARENB
и
PARODD
При установке
PARENB
генерируется бит четности. Если
PARODD
не установлен, генерируется проверка на четность. Если
PARODD
установлен, генерируется проверка нечетность. Если
PARENB
не установлен,
PARODD
игнорируется.
CRTSCTS
Использовать аппаратное управление потоком (линии RTS и CTS). При высоких скоростях (19 200 бит/с и более) программное управление потоком с помощью символов XON и XOFF становится неэффективным. Вместо этого следует использовать аппаратное управление потоком. Этот флаг не определен в POSIX и не доступен под этим именем в большинстве других систем Unix. Это особенно непереносимая область управления терминалом, несмотря на распространенную потребность в аппаратном управлении потоком в современных системах. Система SVR4 особенно характерна тем, что она не предоставляет возможности установки управления потоком с помощью
termios
, а только через другой интерфейс под названием
termiox
.

114

Linux также использует

c_cflag
для хранения скорости, но не стоит на это полагаться. Вместо этого применяйте
cfsetospeed
и
cfstispeed
.

  • Читать дальше
  • 1
  • ...
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: