Операционная система UNIX. Руководство программиста

Опции ввода


Система UNIX производит множество действий с символами, вводимыми пользователем. Среди прочего, система выполняет следующее:

  • Отображает вводимые символы на экране терминала (такое отображение мы будем называть эхом).
  • Обрабатывает символы забоя (ERASE, обычно #) и уничтожения (KILL, обычно @).
  • Интерпретирует CTRL+D как конец файла (EOF).
  • Обрабатывает символы прерывания (INTR) и выхода (QUIT).
  • Сбрасывает бит четности символа.
  • Преобразует возврат каретки в перевод строки.

Curses полностью берет на себя управление экраном терминала, поэтому его подпрограммы отключают эхо, производимое системой UNIX, и делают его самостоятельно. Временами бывает необходимо программно отключать стандартную для системы UNIX обработку символов. Для этого предназначены некоторые подпрограммы curses, например, noecho() и cbreak(). Используя такие подпрограммы, можно управлять интерпретацией вводимых символов. В приведенной ниже таблице перечислены основные подпрограммы, предназначенные для управления режимом ввода.

Если программа использует curses и вводит с терминала, она должна установить некоторые опции ввода. Это связано с тем, что при старте программы терминал может оказаться в любом из режимов cbreak(), raw(), nocbreak(), или noraw(). Как показано в таблице, при запуске программы гарантируется только наличие режима echo().

Как правило, в интерактивной терминальной программе используются комбинация режимов noecho() и cbreak(). Пусть, например, нужно отображать вводимые символы не там, где находится курсор, а в нижней строке экрана. Для этого предназначена подпрограмма noecho(). Однако, хотя noecho() и подавляет отображение вводимых символов, символы забоя и уничтожения обрабатываются обычным образом. Для отключения этого режима используется подпрограмма cbreak().



Опции ввода Символы
Интерпретируются Не интерпретируются
Нормальное состояние "вне curses" прерывание, выход, сброс бита четности, <CR> в <NL>, забой, уничтожение, конец файла
Нормальное состояние "старт curses-программы" эхо (заменяет эхо системы UNIX) все остальное не определено
cbreak () и echo () прерывание, выход, сброс бита четности эхо забой, уничтожение, конец файла
cbreak () и noecho () прерывание, выход, сброс бита четности забой, уничтожение, конец файла, эхо
nocbreak () и noecho () разрыв, выход, сброс бита четности, забой, уничтожение, конец файла эхо
nocbreak () и echo () См. предостережение ниже
nl () <CR> в <NL>  
nonl ()   <CR> в <NL>
raw () [вместо cbreak ()]   разрыв, выход, сброс бита четности
<
Предостережение

Не применяйте одновременно nocbreak() и noecho(). Если установлены оба режима и Вы вызываете getch(), программа при чтении каждого символа включает, а затем отключает cbreak(). В зависимости от состояния драйвера терминала при вводе символа, это может привести к выводу нежелательных данных на экран.

Помимо подпрограмм, перечисленных в таблице, для управления вводом используются следующие подпрограммы curses: noraw(), halfdelay(), nodelay(). Они обсуждаются в curses(3X).

Далее подробнее описываются подпрограммы noecho(), cbreak() и связанные с ними echo() и nocbreak().

echo( ), noecho( )

СИНТАКСИС
  #include <curses.h>

int echo ( )

int noecho ( )
ОПИСАНИЕ
  echo() устанавливает режим "эхо" - отображение символов на экране по мере их ввода. При старте программы этот режим установлен.
noecho() отключает режим "эхо".

Ни та, ни другая подпрограмма не возвращают полезных значений.

curses-программы могут работать неправильно, если эхо установлено одновременно с nocbreak(). См. таблицу выше и последующее предостережение. После отключения эха вводимые символы можно отображать посредством addch().

ПРИМЕР
  См. программы editor и show в разделе Примеры программ, работающих с curses.
cbreak( ), nocbreak( )

СИНТАКСИС
  #include <curses.h>

int cbreak ( )

int nocbreak ( )
ОПИСАНИЕ
  cbreak() включает режим "прерывание при вводе каждого символа". Программа получает каждый символ сразу после его ввода, но символы забоя, уничтожения и конца файла не обрабатываются.
nocbreak() возвращает к обычному режиму "построчный ввод". Обычно этот режим установлен при запуске прог- раммы.

Ни одна из подпрограмм не возвращает полезных значений.

curses-программы могут работать неправильно, если cbreak() включается и отключается в пределах одной программы, либо если используется комбинация nocbreak()

и echo().

См. таблицу выше и последующее предостережение.

ПРИМЕР
  См. программы editor и show в разделе Примеры программ, работающих с curses.



Содержание раздела