Книга: Основы программирования в Linux
Специальные управляющие символы
Разделы на этой странице:
Специальные управляющие символы
Специальные управляющие символы — это коллекция символов подобных символам от комбинации клавиш <Ctrl>+<C>, действующих особым образом, когда пользователь вводит их. В элементе c_cc
структуры termios
содержатся символы, отображенные на поддерживаемые функции. Позиция каждого символа (его номер в массиве) определяется макросом, других ограничений для управляющих символов не задано.
Массив c_cc
используется двумя очень разными способами, зависящими от того, установлен для терминала канонический режим (т.е. установлен флаг ICANON
в элементе c_lflag
структуры termios
) или нет.
Важно понять, что в двух разных режимах есть некоторое взаимное наложение при применении номеров элементов массива. По этой причине никогда не следует смешивать значения для этих двух режимов.
Для канонического режима применяются следующие индексы:
? VEOF
— символ EOF
;
? VEOL
— дополнительный символ конца строки EOL
;
? VERASE
— символ ERASE
;
? VINTR
— символ прерывания INTR
;
? VKILL
— символ уничтожения KILL
;
? VQUIT
— символ завершения QUIT
;
? VSUSP
— символ приостанова SUSP
;
? VSTART
— символ запуска START
;
? VSTOP
— символ останова STOP
.
Для канонического режима применяются следующие индексы:
? VINTR
— символ INTR
;
? VMIN
— минимальное значение MIN
;
? VQUIT
— символ QUIT
;
? VSUSP
— символ SUSP
;
? VTIME
— время ожидания TIME
;
? VSTART
— символ START
;
? VSTOP
— символ STOP
.
Символы
Поскольку для более сложной обработки вводимых символов специальные символы и неканонические значения очень важны, мы описываем их в табл. 5.1.
Таблица 5.1
Символ | Описание |
---|---|
INTR |
Заставляет драйвер терминала отправить сигнал SIGINT процессам, подключенным к терминалу. Мы обсудим сигналы более подробно в главе 11 |
QUIT |
Заставляет драйвер терминала отправить сигнал SIGQUIT процессам, подключенным к терминалу |
ERASE |
Заставляет драйвер терминала удалить последний символ в строке |
KILL |
Заставляет драйвер терминала удалить всю строку |
EOF |
Заставляет драйвер терминала передать все символы строки во ввод, считываемый приложением. Если строка пустая, вызов read вернет ноль символов, как будто он встретил на конец файла |
EOL |
Действует как ограничитель строки в дополнение к более привычному символу перехода на новую строку |
SUSP |
Заставляет драйвер терминала послать сигнал SIGSUSP процессам, подключенным к терминалу. Если ваша система UNIX поддерживает управление заданиями, текущее приложение будет приостановлено |
STOP |
Действует как "прерыватель потока", т. е. прекращает дальнейший вывод на терминал. Применяется для поддержки управления потоком XON/XOFF и обычно задается как ASCII-символ XOFF (<Ctrl>+<S>) |
START |
Возобновляет вывод после символа STOP , часто ASCII-символ XON |
Значения TIME и MIN
Значения TIME
и MIN
применяются только в неканоническом режиме и действуют вместе для управления считыванием входных данных. Вместе они управляют действиями при попытке программы прочесть дескриптор файла, ассоциированный с терминалом.
Возможны четыре варианта.
? MIN = 0
и TIME = 0
. В этом случае вызов read
всегда завершается сразу же. Если какие-то символы доступны, они будут возвращены, если нет, то read
вернет ноль, и никакие символы не будут считаны.
? MIN = 0
и TIME > 0
. В этом случае вызов read
завершится, когда все доступные символы будут считаны или когда пройдет TIME
десятых долей секунды. Если нет прочитанных символов из-за превышения отпущенного времени, read
вернет 0. В противном случае он вернет количество прочитанных символов.
? MIN > 0
и TIME = 0
. В этом случае вызов read
будет ждать до тех пор, пока можно будет считать MIN
символов, и затем вернет это количество символов. В случае конца файла возвращается 0.
? MIN > 0
и TIME > 0
. Это самый сложный случай. После вызова read
ждет получения символа. Когда первый символ получен, каждый раз при получении последующего символа запускается межсимвольный таймер (или перезапускается, если он уже был запущен). Вызов read
завершится, когда либо можно будет считать MIN
символов, либо межсимвольное время превысит TIME
десятых долей секунды. Это может пригодиться для подсчета разницы между единственным нажатием клавиши <Esc> и запуском функциональной клавиатурной escape-последовательности. Тем не менее следует знать, что сетевые соединения или высокая загрузка процессора могут полностью стереть такие полезные сведения о времени.
Установив неканонический режим и используя значения MIN
и TIME
, программы могут выполнять посимвольную обработку ввода.
Доступ к режимам терминала из командной оболочки
Если вы хотите просмотреть параметры termios
, находясь в командной оболочке, примените следующую команду для получения их списка:
$ stty -a
На установленных у авторов системах Linux, обладающих структурами termios
с некоторыми расширениями по сравнению со стандартными, получен следующий вывод:
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O, min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmirk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff
-iuclc -ixany -imaxbe1 iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel n10 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
Среди прочего, как видите, символ EOF
— это <Ctrl>+<D>, и включено отображение. Экспериментируя с установками терминала, легко получить в результате терминал в нестандартном режиме, что затруднит его дальнейшее использование. Есть несколько способов справиться с этой трудностью.
? Первый способ — применить следующую команду, если ваша версия stty
поддерживает ее:
$ stty sane
Если вы потеряли преобразование клавиши возврата каретки в символ перехода на новую строку (который завершает строку), возможно, потребуется ввести stty sane
, но вместо нажатия клавиши <Enter> нажать комбинацию клавиш <Ctrl>+<J> (которая обозначает переход на новую строку).
? Второй способ — применить команду stty -g
и записать текущие установки stty
в форму, готовую к повторному считыванию. В командной строке вы можете набрать следующее:
$ stty -g > save_stty
...
<эксперименты с параметрами>
...
$ stty $(cat save_stty)
В финальной команде stty
вам все еще придется использовать комбинацию клавиш <Ctrl>+<J> вместо клавиши <Enter>. Ту же самую методику можно применить и в сценариях командной оболочки.
save_stty="$(stty -g)"
<изменение stty-параметров>
stty $save_stty
? Если вы все еще в тупике, третий способ — перейти на другой терминал, применить команду ps для поиска оболочки, которую вы сделали непригодной, и затем использовать команду kill hup <id процесса>
для принудительного завершения этой командной оболочки. Поскольку перед выводом регистрационного приглашения параметры stty
всегда восстанавливаются, у вас появится возможность нормально зарегистрироваться в системе еще раз.
Задание режимов терминала из командной строки
Вы также можете применять команду stty
для установки режимов терминалов непосредственно из командной строки.
Для установки режима, в котором ваш сценарий командной оболочки сможет выполнять посимвольное считывание, вы должны отключить канонический режим и задать 1 и 0. Команда будет выглядеть следующим образом:
$ stty -icanon min 1 time 0
Теперь терминал будет считывать символы немедленно, вы можете попробовать выполнить еще раз первую программу menu1. Вы увидите, что она работает, как первоначально и предполагалось.
Вы также могли бы улучшить вашу попытку проверки пароля (см. главу 2), отключив отображение перед приглашением ввести пароль. Команда, выполняющая это действие, должна быть следующей:
$ stty -echo
Примечание
Не забудьте применить команду stty echo
для возврата отображения после ваших экспериментов!
- Международные символы
- 16.5.7. Управляющие символы
- 21.3.1. Управляющие символы
- 1. Металингвистические символы
- Специальные символы
- 7.8. Специальные вопросы
- Нужно набрать специальные символы, а на клавиатуре нет таких клавиш
- Что делать, если вместо русских букв в программах – непонятные символы?
- Специальные текстовые блоки
- ГЛАВА 3 СПЕЦИАЛЬНЫЕ ТРЕБОВАНИЯ К ОТДЕЛЬНЫМ ВИДАМ РЕКЛАМЫ
- 19.5.1 Специальные символы
- Пробельные символы