Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#15| Dragon God
Demon's Souls |#14| Flamelurker
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Сэйдж Рас Весь текст 822.4 Kb

Приемы профессиональной работы в Unix

Предыдущая страница Следующая страница
1 ... 47 48 49 50 51 52 53  54 55 56 57 58 59 60 ... 71
 |       |   :    /     +--------+        +--------+    /  +-------+ : |     |
 | +----+|   :  /       структура         структура   /   структура  : +-----+
 | |ubuf||<---/         clist             clist     /     ccblock    :
 | +----+|   :                                    /                  :
 | +----+|   :                       +--------- / ttxput()           :
 | |ubuf||----                       |                               :
 | +----+|   : \        +-------+ <--+   +--------+                  : +-----+
 |-------|   :   \      |выходн.|        |буфер   |                  : |dbuf |
 |Стек   |   :     \--->|очередь|------->|передачи|------------------->|     |
 |       |   :          +-------+ ttout()+--------+      dzxint()    : +-----+
 +-------+   : ttwrite() структура        структура                  :
                         clist            ccblock                   /|\
                                                                     |
                                                               ------+
                                                      Граница драйвера
                                                      устройства

 -------------------------------------------------------------------

     Когда какой-либо процесс читает символы с устройства,  данные на-
чинают двигаться от буфера  драйвера  устройства,  который  называется
dbuf.  Из  этого буфера данные попадают в приемный буфер,  управляемый
ядром.  Приемный буфер читается подпрограммой ядра с именем ttin(),  и
данные  помещаются  в структуру clist,  называемую необработанной оче-
редью. (Слово "необработанная" означает, что над символами пока что не
производилось  никакой обработки.) В то же время символы также помеща-
ются в выходную очередь, что позволяет системе выполнять эхо-отображе-
ние символов по мере их ввода.

     После этого  подпрограмма  canon() превращает необработанную оче-
редь в каноническую. ("Каноническая" означает применение правил, кото-
рые  в  данный  момент установлены системой для выполнения специальных
функций над строкой текста,  например для обработки символа удаления.)
Такая обработка позволяет преобразовать данные перед тем, как их полу-
чит процесс пользователя.  Последней подпрограммой является  ttread(),
которая  читает  символы  из  канонического  буфера  в буфер пользова-
тельского процесса в области данных процесса.

     Когда символы записываются из процесса пользователя на  терминал,
они проделывают почти такой же маршрут в обратном направлении:  от об-
ласти процесса к области драйвера устройства. Основное отличие в подп-
рограмме записи заключается в том, что эти данные проходят на один бу-
фер меньше.  От процесса пользователя символы  передаются  в  выходную
очередь  ядра подпрограммой ttwrite(),  а затем в буфер передачи с по-
мощью подпрограммы ttout().  Из буфера передачи они  пересылаются  не-
посредственно  в приемный буфер драйвера устройства с помощью подпрог-
раммы dzxint().

     ОПРЕДЕЛЕНИЕ ВВОДИМЫХ СИМВОЛОВ

     Бывает так, что мы хотим увидеть, какие символы вводятся с клави-
атуры. Мы могли бы для этого написать программу, но UNIX предоставляет
встроенную возможность для этой цели.

     Это команда  od - восьмеричный дамп (octal dump).  Такое название
осталось еще с тех давних времен, когда восьмеричное исчисление широко
применялось при отладке.  К счастью, результат работы команды od можно
получить в символьном,  шестнадцатиричном или десятичном  виде.  Фокус
использования команды od для проверки входных и выходных значений зак-
лючается в том,  что od читает стандартное устройство ввода по умолча-
нию, если не указан файл. Например, вызов

$ od -cx
test string
^d
^d

даст такой результат:

---------------------------------------------------------------------------

|
|    0000000    6574    7473    7320    7274    6e69    0a67
|              t   e   s   t       s   t   r   i   n   g  \n
|    0000014
|    $
|

     Здесь вызов команды od делается без указания имени  файла  в  ко-
мандной строке и с применением стандартного вывода в качестве выводно-
го устройства. Мы используем опцию -cx для того, чтобы байты интерпре-
тировались как символы ASCII, а соответствующие 16-битовые слова отоб-
ражались в шестнадцатиричном виде. По мере того, как вы набираете сим-
волы,  они  отображаются на экране,  а команда od сохраняет их в своем
буфере.  В конце строки нажмите возврат каретки,  затем  CTRL-D.  Ввод
CTRL-D  завершает  чтение символов командой od и выдает распечатку,  в
которой сверху будут шестнадцатиричные значения, а снизу символы в ко-
де ASCII.

     Обратите внимание,  что два символа,  выводимые для каждого шест-
надцатиричного слова,  располагаются в обратном порядке по сравнению с
двумя байтами, образующими это слово. Например, слово 6574 интерпрети-
руется как два символа,  t и e, где 65 - код ASCII для символа e, а 74
- ASCII-код для символа t. Для того чтобы выйти из команды od, введите
еще один CTRL-D для прекращения блочного чтения.  Если вы  хотите  еще
проверять   символы,  продолжайте  их  вводить.  Команда  od  работает
несколько загадочно.  Если вы введете достаточное количество символов,
она  выдаст на экран информацию по нажатию только лишь возврата карет-
ки.  Но если вы ввели всего несколько символов,  требуется нажатие как
возврата каретки, ТАК И CTRL-D для получения результата на экране.

     Теперь мы можем сделать один фокус - изменить канонический способ
обработки при чтении символов командой od.  Это позволит  нам  увидеть
эффект  от  различных установок протокола работы.  Для этого проверьте
текущие установки вашего терминала.  В версии System V используйте ко-
манду "stty -a", а в версии Berkeley вам нужно применить команду "stty
everything".  System V выдает гораздо больше параметров, чем Berkeley.
(Наиболее популярные версии UNIX'а разработаны и поддерживаются следу-
ющими фирмами:  System V - фирмой AT&T Bell  Laboratories,  которая  в
настоящее  время  называется  Unix System Laboratories;  BSD (Berkeley
Software Distribution) - Калифорнийским университетом в Беркли;  XENIX
- фирмой Microsoft.- Прим. перев.) Ниже приводится пример из XENIX:

---------------------------------------------------------------------------

|
| speed 9600 baud; line = 0;
| intr = DEL; quit = ^|; erase = ^h;
| kill = ^u; eof = ^d; eol = ^`
| parenb -parodd cs7 -cstobp hupcl cread -clocal
| -ignbrk brkint ignpar -parmrk -inpck istrip -inlcr -igncr icrnl -iuclc
| ixon ixany -ixoff
| isig icanon -xcase echo echoe echok -echonl -noflsh
| opost -olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel ff1
|

     После того,  как мы почешем голову,  мы увидим,  что текущий флаг
для канонической обработки установлен в состояние "icanon".  То  есть,
мы можем видеть,  что он включен,  поскольку нет префикса в виде знака
минус (хотя это не является строгим правилом).

     Что происходит при канонической обработке? Символ возврата на шаг
назад (backspace) является одним из важных вопросов.  Когда вы вводите
символ CTRL-H,  он поступает в необработанную очередь как  литеральный
символ CTRL-H. Когда программа canon() читает CTRL-H, она понимает это
так: "Изменить CTRL-H на символ возврата на шаг назад, записать пробел
на  место символа,  затем сделать еще шаг назад." При эхо -отображении
вы получаете удаление символа на экране.  Когда каноническая обработка
отключена,  вы посылаете CTRL-H как обычные символы.  Вот пример того,
как это выглядит:

---------------------------------------------------------------------------

|
| $ stty -icanon           Отключение канонической обработки
| $ od -cx
| test string^h^h^h^h^h^hcase
| ^d...
|
| 0000000    6574    7473    7320    7274    6e69    0867    0808    0808
|   t   e   s   t       s   t   r   i   n   g  \b  \b  \b  \b  \b
| 0000020    6308    7361    0a65    0a04    0a0a    0a0a    0a0a    0a0a
| \b    c   a   s   e  \n 004  \n  \n  \n  \n  \n  \n  \n  \n  \n
|

     После слова  "string"  вы  видите  группу  чисел  08,  которые  в
ASCII-коде обозначают CTRL-H.  Эти числа 08 показывают вам,  что лите-
ральные  символы  CTRL-H действительно присутствуют в их "необработан-
ной" форме.  Поскольку CTRL-H не является больше специальным символом,
команда  od  рассматривает  его подобно любому другому символу.  Здесь
возникает новая проблема:  поскольку специальные символы не  распозна-
ются,  мы потеряли возможность завершить блочное чтение вводом символа
конца файла (EOF). Когда вводится CTRL-D, он понимается просто как еще
один  символ.  Поэтому  мы  должны  заполнить буфер команды od,  чтобы
заставить ее выполнить дамп.  В нашем примере CTRL-D - это символ  004
после символов case \n.

     Кстати, в  системе Berkeley используются установки "обработанная"
("cooked") и "необработанная" ("raw") для stty,  которые  по  существу
служат для тех же целей, что "canon" и "-canon" в System V.

     ДИНАМИЧЕСКОЕ ПЕРЕОПРЕДЕЛЕНИЕ СИМВОЛОВ ПРЕРЫВАНИЯ

     Обратите внимание,  что  в  предыдущей распечатке команды stty -a
присутствуют определения символов "intr" и "quit".  Это  две  функции,
которые  прерывают  работу  ваших работающих процессов.  Строки intr и
quit представляют собой особые функции,  а не просто нажатие  клавиши.
Эти функции можно назначить на любую клавишу клавиатуры при помощи ко-
манды stty.

     Если мы изменили значение "intr" на другой символ,  то этот новый
символ  прервет  ваши  процессы.  Вы даже можете установить в качестве
клавиши прерывания обычный символ. Вот как это можно сделать:

$ stty intr x
$ this is a junk stringx
$

     Когда вы вводите символ x в конце строки, то вся введенная строка
обрывается  и  вы  получаете новый символ приглашения.  Для того чтобы
вернуться к обычному режиму работы,  введите в качестве символа преры-
вания старый символ. Если старым символом был "delete", вы даете такую
команду:

$ stty intr DEL

     Что же в этом хорошего?  Это показывает, насколько гибко работает
команда stty с терминалом, и может быть использовано в качестве личной
меры безопасности,  чтобы сбить с толку человека,  который захотел  бы
произвести  какой-либо беспорядок с вашего терминала.  Когда вам нужно
на минуту отойти от терминала,  измените ключ прерывания на какой-либо
другой и запустите командный файл вроде такого:

while :
do
:
done

     Этот бесконечный цикл будет выполняться постоянно.  Если  кто-ни-
будь попытается прервать этот процесс,  используя клавишу DEL,  ничего
не произойдет.  Когда вы вернетесь,  нажмите новую клавишу прерывания.
Она прервет цикл, и вы получите символ приглашения.

     Очень важным является также символ "eof".  Он соответствует концу
файла (end of file), и обычно им является CTRL-D. Это объясняет, поче-
му  вы  выходите из системы UNIX с помощью CTRL-D.  Когда вы посылаете
CTRL-D вашему регистрационному  shell,  вы  тем  самым  говорите  ему:
"Shell,  это  метка конца файла для данного сеанса работы".  Поскольку
терминал рассматривается как файл, CTRL-D закрывает файл, а shell, ко-
торый  работает  как  цикл вида "читать команды с клавиатуры,  пока не
встретится EOF", завершается, тем самым посылая сигнал программе init.
Программа  init  порождает команду getty по данной терминальной линии,
которая выводит на экран приглашение "login:" для ожидания команды  от
следующего пользователя. Если вы измените символ конца файла, вы боль-
ше не сможете выйти из shell по CTRL-D.  Он будет выводиться на  экран
точно так же, как любой другой символ. Вот пример таких действий:

$ stty eof x
$ x
login:

     Теперь признаком конца файла является обычный символ x.  Когда вы
вводите символ x,  это равносильно вводу  CTRL-D,  и  вы  выходите  из
системы. Очевидно, такие манипуляции нежелательны, однако это позволя-
ет показать ту большую степень гибкости,  которую использует UNIX  при
Предыдущая страница Следующая страница
1 ... 47 48 49 50 51 52 53  54 55 56 57 58 59 60 ... 71
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (52)

Реклама