Разработка приложений в среде Linux. Второе издание
Шрифт:
Кроме того, существуют флаги задержки, которые устанавливать не нужно; они предназначены для компенсации старого, плохо спроектированного и на данный момент, к счастью, редко встречающегося оборудования. За управление флагами задержки ответственны библиотеки
16.5.6. Управляющие флаги
Флаги режима управления влияют на такие параметры протокола, как четность и управление потоком [114] . Флаги, устанавливаемые в
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 также использует
16.5.7. Управляющие символы
Управляющие символы — это символы со специальными значениями, которые могут отличаться в зависимости от того, находится ли терминал в каноническом или неформатируемом режиме ввода, и в зависимости от установок различных управляющих флагов. Каждое смещение (кроме
Макрос
Некоторые системы имеют макрос
Расположения символов, не определенные POSIX, активны только в случае установки локального управляющего флага
Управляющие символы, которые вы видите как индексы массива
VINTR | Смещение VINTR обычно устанавливается в ^C . Оно обычно сбрасывает на диск очереди ввода-вывода и передает SIGINT элементам группы процесса переднего плана, ассоциированным с tty. Процессы, неявно обрабатывающие SIGINT , немедленно завершаются. |
VQUIT | Смещение VQUIT обычно устанавливается в ^\ . Оно обычно сбрасывает на диск очереди ввода-вывода и передает SIGQUIT элементам группы процесса переднего плана, ассоциированным с tty. Процессы, неявно обрабатывающие SIGQUIT , завершаются, при возможности сброса дампа ядра (см. главу 10). |
VERASE | Смещение VERASE обычно устанавливается в ^H или ^? . В каноническом режиме оно обычно стирает предыдущий символ в строке. В неформатируемом режиме это несущественно. |
VKILL | Смещение VKILL обычно установлено в ^U . В каноническом режиме оно обычно стирает всю строку. В неформатируемом режиме это несущественно. |
VEOF | Смещение VEOF обычно установлено в ^D . В каноническом режиме оно заставляет read на файловом дескрипторе возвращать 0, сигнализируя о состоянии конца файла. На некоторых системах оно может делить пространство с символом VMIN , активным лишь в неформатируемом режиме. (Это не проблема, если вы сохраните struct termios с каноническими установками режима для восстановления действий в неформатируемом режиме, что все равно присуще практике программирования с применением termios .) |
VSTOP | Смещение VSTOP обычно установлено в ^S . Оно заставляет tty приостановить передачу выходных данных до получения символа VSTART , или, в случае установки IXANY , до получения любого символа. |
VSTART | Смещение VSTART обычно установлено в ^Q . Оно запускает приостановленный вывод tty. |
VSUSP | Смещение VSUSP обычно установлено в ^Z . Оно вызывает передачу SIGTSTP текущей группе процессов переднего плана; более подробно об этом рассказывается в главе 15. |
VEOL и VEOL2 | В каноническом режиме эти символы, а также символ новой строки ( '\n' ), сигнализируют о состоянии конца строки. Это вызывает передачу скомпонованного буфера и запуск нового буфера. На некоторых системах VEOL может делить пространство с символом VTIME , активным лишь в неформатируемом режиме, так же, как VEOF может делить пространство с VMIN . Символ VEOL2 в POSIX не определен. |
VREPRINT | Смещение VREPRINT обычно установлено в ^R . В каноническом режиме в случае установки флага ECHO оно вызывает локальное отражение символа VREPRINT , новой строки (и возврата каретки, если это допустимо), а также перепечатку всего текущего буфера. Этот символ в POSIX не определен. |
VWERASE | Смещение WERASE обычно установлено в ^W . В каноническом режиме оно стирает все пробелы в конце буфера, затем все остальные символы, что дает эффект стирания предыдущего слова в строке. Этот символ в POSIX не определен. |
VLNEXT | Смещение VLNEXT обычно установлено в ^V . Само оно не вводится в буфер, но вызывает литеральное помещение в буфер следующего символа, даже если это один из управляющих символов. Для того чтобы ввести один литеральный символ VLNEXT , введите его дважды. Этот символ в POSIX не определен. |
Для отключения любой позиции управляющего символа установите его значение в
16.5.8. Локальные флаги
Флаги локального режима влияют на локальную обработку, что в какой-то мере относится к способу сбора символов перед их выводом. Когда устройство находится в каноническом режиме (режиме с обработкой), символы отражаются локально без передачи в удаленную систему до тех пор, пока не встретится символ новой строки. На этом этапе передается вся строка, а удаленный конец обрабатывает ее без повторного отражения. В неформатируемом режиме каждый символ передается в удаленную систему в таком виде, в каком он принимается. Иногда символ отображается только удаленной системой, иногда только локальной, а иногда, например, при чтении пароля, он и вовсе не отображается.
Некоторые флаги могут вести себя иначе, в зависимости от того, в каком режиме находится терминал: каноническом или неформатируемом. Флаги, ведущие себя иначе в каноническом и неформатируемом режимах, отмечены.
Флаги, работающие на
ICANON | При установке ICANON включается канонический режим. Если ICANON не установлен, включается неформатируемый режим. |
ECHO | При установке ECHO включается локальное эхо. Если ECHO не установлен, все остальные флаги, названия которых начинаются с ECHO , эффективно отключаются и функционируют так, как будто они все, кроме ECHONL , не установлены. |
ECHOCTL | При установке ECHOCTL управляющие символы выводятся как ^C , где С — это символ, формирующийся добавлением восьмеричного 0100 к управляющему символу, по модулю восьмеричного 0200. Поэтому Control-C отображается как ^C , a Control-? (восьмеричный 0177) отображается как ^? (? — это восьмеричный 77). Этот флаг в POSIX не определен. |
ECHOE | В каноническом режиме при установке ECHOE в случае получения символа ERASE предыдущий символ на дисплее по возможности стирается. |
ECHOK и ECHOKE | В каноническом режиме при получении символа KILL вся текущая строка стирается из буфера. Если не установлены ни ECHOK , ни ECHOKE , ни ECHOE , выводится представление символа KILL с помощью ECHOCTL (^U по умолчанию) для обозначения стертой строки. Если установлены ECHOE и ECHOK , но ECHOKE не установлен, выводится представление символа KILL с помощью ECHOCTL , сопровождаемое новой строкой, которая затем обрабатывается OPOST в случае установки OPOST . Если установлены ECHOE , ECHOK и ECHOKE , строка стирается. См. описание ECHOPRT для другой вариации на эту тему. Флаг ECHOKE в POSIX не определен. В системах без флага ECHOKE установка флага ECHOK может быть эквивалентна установке и ECHOK , и ECHOKE в Linux. |
ECHONL | В каноническом режиме при установке ECHONL символы новой строки ('\n' ) отражаются даже в том случае, если ECHO не установлен. |
ECHOPRT | В каноническом режиме при установке ECHOPRT символы выводятся при стирании, когда принимаются символы ERASE или WERASE (или KILL , если установлены ECHOK и ECHOKE ). Когда принимается первый в последовательности символ стирания, выводится \ , а при выводе последнего символа стирания (достигается конец строки или вводится нестертый символ), выводится / . Каждый вводимый вами нормальный символ просто отображается. Поэтому ввод asdf , сопровождаемый двумя символами ERASE , а также df и символом KILL , будет выглядеть следующим образом: asdf\fd/df\fdsa/ . Этот флаг полезен для отладки и использования документирующих терминалов вроде первоначального телетайпа, где символы печатаются на бумаге; в другом случае он не пригодится. Этот флаг в POSIX не определен. |
ISIG | Если установлен ISIG , управляющие символы INTR , QUIT и SUSP вызывают отправку соответствующего сигнала (SIGINT , SIGQUIT или SIGTSTP соответственно; см. главу 12) всем процессам в текущей группе процессов переднего плана на данном tty. |
NOFLSH | Обычно при получении символов INTR и QUIT очереди ввода и вывода сбрасываются. При установке NOFLSH очереди не сбрасываются. |
TOSTOP | Если установлен TOSTOP , то в том случае, когда процесс, не находящийся в текущей группе процессов переднего плана, пытается выполнить запись в свой управляющий терминал, передается SIGTTOU всей группе процессов, членом которой является данный процесс. По умолчанию этот сигнал останавливает процесс, как при нажатии комбинации клавиш, соответствующей символу SUSP . |
IEXTEN | Этот флаг описан в POSIX как определяемый реализацией. Он включает обработку символов ввода, определяемую реализацией. Хотя переносимые программы не устанавливают этот бит, IUCLC и определенные возможности стирания символов в Linux зависимы от его установки. К счастью, он чаще всего разрешен по умолчанию в системах Linux, поскольку ядро изначально разрешает его при установке tty, поэтому обычно не нужно устанавливать его по какой-либо причине. |
16.5.9. Управление
Два элемента в массиве
В неформатируемом режиме считывание по одному байту за раз неэффективно. Также неэффективно опрашивать порт чтением в неблокируемом режиме. Существуют два намного более эффективных дополнительных метода чтения.
Первый заключается в использовании
"Управляющие символы"
• Если
• Если