Книга: Разработка приложений в среде Linux. Второе издание

16.5.7. Управляющие символы

16.5.7. Управляющие символы

Управляющие символы — это символы со специальными значениями, которые могут отличаться в зависимости от того, находится ли терминал в каноническом или неформатируемом режиме ввода, и в зависимости от установок различных управляющих флагов. Каждое смещение (кроме VMIN и VTIME) в массиве с_сс обозначает действие и содержит код символа, предназначенный для этого действия. Например, установите символ прерывания на Control-C с помощью следующего кода:

ts.с_сс[VINTR] = CTRLCHAR('С');

Макрос CTRLCHAR() определен как

#define CTRLCHAR(ch) ((ch)&0x1F)

Некоторые системы имеют макрос CTRL(), определенный в <termios.h>, но не поддерживаемый во всех системах, поэтому определение нашей собственной версии будет более надежным. Мы используем запись ^C для обозначения Control-C.

Расположения символов, не определенные POSIX, активны только в случае установки локального управляющего флага IEXTEN(c_lflag).

Управляющие символы, которые вы видите как индексы массива с_сс, перечислены ниже.

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

Для отключения любой позиции управляющего символа установите его значение в _POSIX_VDISABLE. Это работает только в случае определения _POSIX_VDISABLE как значения, не равного -1. _POSIX_VDISABLE работает в Linux, но переносимая программа, к сожалению, не сможет зависеть от отключения расположений управляющих символов во всех системах.

Оглавление книги


Генерация: 0.714. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз