Лабораторная работа N 4.
Устройства ввода и вывода информации.
Терминальный вывод.
27 Августа 2007 г.
Кафедра ТС и ВС
Содержание
Цель работы 3
Теоретическое введение 3
2.1 Терминалы 15
2.1.1 Команды терминала 16
2.1.2 Функции управления терминалом 18
2.2 Доступы к терминалам в Linux 18
2.2.1 Режимы работы терминала 19
2.2.2 Управление терминалом. Структура termios 20
Требование к отчету о лабораторной работе 25
Задание на лабораторную работу 25
Контрольные вопросы
1 Цель работы
. Понять, как работает терминал и что такое эмуляция терминала. Рассмотреть принцип программного взаимодействия с клавиатурой и экраном (терминалом) в Linux.
2 Теоретическое введение
2.1 Терминалы
В дни универсальных ЭВМ с середины 1970-х до середины 1980-х терминал соединялся с компьютером кабелем (часто не напрямую). Он стал называться терминалом, так как был размещен на терминальном конце этого кабеля (оконечное оборудование).
Терминал состоит из экрана и клавиатуры, которые совместно используются, чтобы дистанционно связаться с компьютером. Программы выполняются на компьютере, но результаты отображаются на экране терминала.
Текстовый терминал часто соединен с последовательным портом компьютера через длинный кабель. Таким образом, в отличие от монитора, который обычно размещен рядом с компьютером, терминал может быть расположен далеко от главного компьютера.
Для текстового терминала идет двунаправленный поток информации (от терминала передается то, что вводится пользователем, к терминалу передается то, что надо вывести на экран). Этот поток является байтами ASCII (American Standart Code for Information Interchange), где каждый байт обычно соответствует символу. Байты, печатаемые на клавиатуре идут на компьютер, а большинство байтов от компьютера отображается на экране терминала. Специальные байты (или последовательности байтов) управляют терминалом, т.е. перемещаю курсор, двигают текст на экране, стирают текст и т.п.
Для передачи используется символы, закодированные с использованием кодовой таблицы для используемого символьного набора. Кодовых таблиц на сегодняшней сущесву-ет много, например ASCII, KOI8, WINDOWS-1251 и т.п.
В таких таблицах каждому символу однозначно в соответствие ставиться десятичное число. Таким образом, терминал получав десятичное число, выводит соответсвующий ему символ на экран.
Операционная система Linux использует эмуляцию терминала для ввода и вывода информации. Совокупность монитора и клавиатуры называется консолью, а все взаи-модействие как бы эмулирует работу с физическим терминалом. Примером терминала может служить текстовый терминал Linux или графический терминал xterm. Такой подход позволил легко организовать сетевые взаимодействия между компьютерами.
В дальнейшем будет рассмотрена только эмуляция терминального доступа в операционной системе Linux.
1.1.1 Команды терминала
Терминал управляется компьютером, который посылает терминалу текст не только для отображения на экране, но также и посылает команды, которые должны выполняться. Они называются управляющими кодами (байтами) и escape-последовательностями.
Например, управляющий код CR (возврат каретки) перемещает курсор на левый край экрана. Некоторая escape-последовательность (несколько байтов, где первый байт -управляющий код (символ) "Escape") может перемещать курсор в место на экране, определенное параметрами, помещенными внутри escape-последовательности. Первые терминалы имели только несколько таких команд, но современные терминалы, имеют их сотни.
Для описания всех возможных команд терминала и его возможностей была принята база данных, называемая "termcap" (теперь "terminfo"). Эта база данных находится в системе и содержит разделы (иногда отдельные файлы) для каждой модели терминала.
Прикладные программы могут использовать эту базу данных, вызывая некоторые функции С-библиотеки. Один большой набор таких программ (более чем 200) называется "ncurses" и перечислен на man-странице для ncurses.
Чтобы получить список доступных команд для текущего терминала можно использовать команду infocmp из библиотеки ncerses.
Например, если находясь в графическом терминале xterm, набрать команду infocmp, то получится следующий результат:
[vml5s22@rwpl vm!5s22]$ infocmp
# Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm
xtermIXI1 terminal emulator,
am, bee, km, mc5i, mir, msgr, xenl,
colors#8, cols#80, it#8, lines#24, pairs#64,
acsc=t taaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}} ,
bel=~G, blink=\E[5m, bold=\E[lm, civis=\E[?251,
clear=\E[H\E[2J, cnorm=\E[?25h, cr=~M,
csr=\E[%i%pl%d;°/,p2%dr, cub=\E [%pl°/,dD, cubl=~H,
cud=\E[°/,pl%dB, cudl=~J, cuf=\E[°/,pl%dC, cufl=\E[C,
cup=\E[%i%pl%d;°/,p2%dH, cuu=\E [%рША, cuul=\E[A,
cvvis=\E[?25h, dch=\E [%pl°/,dP, dchl=\E[P, dl=\E[°/,pl%dM,
dll=\E[M, ech=\E[%pl%dX, ed=\E[J, el=\E[K, ell=\E[lK,
enacs=\E(B\E)0, flash=\E[?5h\E[?51, home=\E[H,
hpa=\E[%i°/,pl%dG, ht=~I, hts=\EH, ich=\E[°/,pl%d@,
il=\E[%pl%dL, ill=\E[L, ind=~J, invis=\E[8m,
is2=\E[!p\E[?3;41\E[41\E>, kal=\EOw, ka3=\EOu, kb2=\EOy,
kbeg=\EOE, kbs=\177, kcl=\EOq, kc3=\EOs, kcubl=\EOD,
kcudl=\EOB, kcufl=\EOC, kcuul=\EOA, kdchl=\E[3~,
kend=\E[4~, kent=\EOM, kfl=\EOP, kf10=\E[21~, kfll=\E[23~,
kf!2=\E[24~, kf!3=\E[25~, kf!4=\E[26~, kf15=\E[28~,
kf!6=\E[29~, kf!7=\E[31~, kf!8=\E[32~, kf!9=\E[33~,
kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS, kf5=\E[15~,
kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
khome=\E[l~, kichl=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
mcO=\E[i, mc4=\E[4i, mc5=\E[5i, op=\E[39;49m, rc=\E8,
rev=\E[7m, ri=\EM, rmacs=~0, rmam=\E[?71,
rmcup=\E[?10471\E [710481, rmir=\E [41 , rmkx=\E[?ll\E>,
rmso=\E[27m, rmul=\E [24m , rsl=\Ec,
rs2=\E[!p\E[?3;41\E[41\E>, sc=\E7, setab=\E[4%pl%dm,
; m , ; m ,
setaf=\E[3%pl°/,dm,
setb=\E [4%?%pl%{l}%=%t4%e%pl%{3}%=%t6%e%pl%{4}%=%
setf =\E [3%?%pl%{l}%=%t4%e%pl%{3}%=%t6%e%pl%{4}%=
sgr=\E [0%?%pl%p6% I %t ; 1% ; %?%p2'/,t ; 4% ; %?%pl%p3% I %t ; 7% ; %?%p4'/,t ; 5% ;
%?%p7%t ; 8% ;m%?%p9%t\016%e\017% ; , sgrO=\E[m\017, smacs=~N, smam=\E[?7h, smcup=\E[?1048h\E[?1047h, smir=\E[4h, smkx=\E[?lh\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?l;2c, u9=\E[c, vpa=\E[%i°/,pl%dd, [vm!5s22@rwpl vm!5s22]$
здесь описаны все возможные команды, которые может выполнить терминал. Например, для очистки экрана (поле clear) необходимо терминалу послать последовательность из 7 символов (\Е (символ с кодом ASCII 27), [, Н, \Е, [, 2, J).
printf ("\033[H\033[2J");
Для детального описания синтаксиса базы termcap (или terminfo) обращайтесь к электронному справочнику man.
Таблица 2: Список некоторых команд терминала xterm
Команда |
Назначение |
\E[H\E[2J |
Очистка экрана |
\Е[х;уН |
Перемещение курсора в позицию х,у (целые положительные числа) |
\хОЕ |
Переключение терминала в режим вывода дополнительных символов (например псевдографики). В данном режиме символы псевдографики располагаются на месте латинских букв. Соответствие знаков псевдографики и символам определяется из поля acsc. Например, для вывода символа "верхний левый угол "надо вывести символ "1". |
\E[fg;bgm |
Установка цвета фона и цвета символа. Цвет задается числом в диапазоне от 0 до 7. Для задания фона к цвету прибавляется число 40, для задания цвета текста прибавляется 30. |
\E[7m |
Установка инверсного режима. |
\E[Om |
Установка нормального режима. |
\E[0;lm |
Установка режима выделения жирным текстом. |
\E[m\017 |
Снятие режима выделения жирным текстом. |
\E[?251 |
Сделать курсор невидимым. |
\E[?25h |
Сделать курсор видимым. |