21.3. Возможности консоли Linux
Консоль Linux, как и большинство терминалов, является модальной: ее взаимодействие с данными зависит от того, в каком режиме она находится. По умолчанию она выводит на экран передаваемые символы, пока не получает управляющий символ или символ перехода. Управляющий символ просто вызывает некоторое регулирующее действие, а следующий символ уже читается обычным образом. Изменений в режиме обработки не происходит. Символ перехода сигнализирует о начале управляющей последовательности и изменяет режим обработки на режим управления.
Например, рассмотрим следующую строку С:
"this is a line\na \033[1mbold\033[0m word\n"
Консоль обрабатывает эту строку в описанной ниже последовательности.
1. Начиная с текущей позиции курсора, консоль печатает слова this is a line
.
2. Обнаруживается символ новой строки (\n
), поэтому (так как Linux и Unix обычно работают в режиме, когда новая строка сигнализирует также о возврате каретки) консоль перемещает курсор в начало следующей строки. При этом если курсор уже был на самой нижней строке, весь экран прокручивается вверх на одну строку.
3. В начале данной линии отображается строка а
.
4. Консоль сталкивается с символом перехода \033
и переводится в управляющий режим.
5. Считывается символ [
, консоль переходит в режим ввода командной последовательности (Command Sequence Introduction — CSI).
6. В режиме CSI считывается последовательность десятичных чисел, закодированных в ASCII и разделенных знаками ;
, которые называются параметрами. Это продолжается до тех пор, пока не встретится первая буква. Буква определяет действие, которое нужно предпринять, с учетом данных в параметрах. В данном случае имеется один параметр 1
, а буква m
означает, что параметр используется для определения изображения символа. Например, параметр 1
устанавливает атрибут полужирного шрифта.
7. Распечатывается строка bold
в полужирном представлении.
8. Далее идет другая последовательность изображения символов, которая восстанавливает все стандартные атрибуты, поэтому строка word
выводится в обычном изображении.
9. В завершение встречается и обрабатывается еще один символ новой строки.
Таким образом, считая, что курсор находился в начале строки, выходные данные полностью будут выглядеть примерно так:
this is a line
a bold word
21.3.1. Управляющие символы
Консоль считывает управляющие символы незамедлительно, действует в соответствии с ними и затем продолжает считывать символы в нормальном режиме.
В файлах и документации termcap
и terminfo
управляющие символы изображаются символом ^c
. Мы будем часто в данной книге использовать это условное обозначение, поскольку оно более универсально и удобно для вас, чем восьмеричные управляющие последовательности С. Для отыскания числового значения управляющего символа в некоторых системах предусмотрен макрос CTRL()
в <termios.h>
, но он не является стандартным для всех систем.
В качестве замены мы предлагаем нашу собственную версию CTRLCHAR()
.
#define CTRLCHAR(ch) ((ch)&0x1F)
Она используется так:
if (с == CTRLCHAR('С')) {
/* был нажат символ Control-C */
}
Управляющие символы, воспринимаемые консолью Linux, описаны в табл. 21.1. Символ ^?
фактически представляет собой '?'+0100
, а не '?'-0100
, поэтому это не настоящий управляющий знак вопроса, но в любом случае стандартное обозначение для него ^?
. Его значение есть 0177 (восьмеричное), 127 (десятичное), 7F (шестнадцатеричное). Вы не сможете использовать макрос CTRL
, описанный только что, для проверки. Вместо этого придется применять числовое значение 127.
Таблица 21.1. Символы управления консолью
Управляющий символ | Имя ASCII | Описание |
---|---|---|
^G |
BEL |
Выдает тональный сигнал. |
^Н |
BS |
Курсор перемещается к предыдущему символу, не перезаписывая его (если только курсор не находится в первой колонке). |
^I |
НТ |
Горизонтальная табуляция; курсор перемещается к следующей точке табуляции. |
^J |
LF |
Новая строка; курсор перемещается на следующую строку; если курсор уже находился в самой нижней точке области прокручивания, то она продвигается вверх. |
^K |
VT |
Вертикальная табуляция; интерпретируется так же, как новая строка. |
^L |
FF |
Подача страницы; интерпретируется так же, как новая строка. |
^М |
CR |
Возврат каретки; курсор перемещается в начало текущей строки. |
^N |
SO |
Сдвиг; используется альтернативный (G1 ) символ, установленный для отображения глифов; изображаются глифы для управляющих символов. |
^O |
SI |
Сдвиг; используется стандартный (G0 ) символ, установленный для отображения глифов; не изображаются глифы для управляющих символов. |
^X |
CAN |
Отменяется любая действующая управляющая последовательность. |
^Z |
SUB |
Отменяется любая действующая управляющая последовательность. |
^[ |
ESC |
ESCape; начало управляющей последовательности. |
^? |
DEL |
Игнорируется. |
ALT-^[ |
- |
Вводится последовательность команд, которая будет описана далее. |