TTY-абстракцияПодсистема TTY, или TTY-абстракция, — это одна из основ Unix или Unix-подобных операционных систем, в частности Linux. Данная система предназначена для использования одного терминала несколькими процессами, некоторых возможностей ввода (например, отправка сигналов специальными клавишами, удаление введённых символов). Такие возможности как изменение цвета символов и фона, изменение начертания символов, перемещение курсора зависят от программы эмуляции или драйвера терминала. Обычно для их реализации используются управляющие последовательности ANSI. ИсторияВ 1869 году был изобретён тикерный аппарат — специальный телеграфный аппарат для передачи котировок ценных бумаг. Постепенно это устройство эволюционировало в телетайп — более быстрый прибор, основанный на таблице символов ASCII. Одно время телетайпы всего мира даже были соединены в единую сеть под названием Telex, адресация в которой осуществлялась на том же принципе вращающегося вала с искателями, что и в механических автоматических телефонных станциях того времени. Сеть Telex использовалась для передачи коммерческих телеграмм. Однако в то время телетайпы пока не подключались к компьютерам. К 1960-м годам компьютеры уже были способны исполнять несколько задач одновременно. В частности, стало возможным взаимодействие компьютера с пользователем в режиме реального времени. Когда устаревшую пакетную модель обработки заданий заменил интерфейс командной строки, в качестве устройств ввода и вывода стали использоваться телетайпы, так как они уже были доступны на рынке. Так как различных моделей телетайпов было множество, потребовался некий уровень программной совместимости, чтобы абстрагироваться от конкретной модели телетайпа. В UNIX и UNIX-подобных системах низкоуровневая работа с телетайпом — например, количество битов в пакете, скорость в бодах, контроль потока, контроль чётности, специальные коды для зачаточного форматирования страницы, и т. д., — возлагалась на ядро операционной системы. Такие возможности, как перемещение курсора, цветной текст и т. п., стали возможны лишь в конце 1970-х годов, с появлением видеотерминалов типа VT-100. Все эти расширенные функции оставались на попечении приложений. С дальнейшим развитием вычислительных машин телетайпы, а затем и видеотерминалы отошли в прошлое. Однако подсистемы для работы с ними, хоть и претерпели существенные изменения, остались в ядрах операционных систем. Сценарий использованияПредположим, пользователь набирает текст на телетайпе, и читает ответ, который печатает компьютер. Телетайп при этом используется как физический (реальный) терминал. Он подключается к компьютеру при помощи универсального последовательного асинхронного порта. Операционная система имеет драйвер порта, который отвечает за физическую передачу байтов (контроль чётности, контроль потока и т. п.). В простейшем случае этот драйвер может просто передавать данные использующему его приложению. Но при этом не будет следующих функций: Редактирование строкПодразумевает под собой возможность удаления напечатанных символов. В соответствии с философией UNIX, программы должны быть как можно проще, поэтому данная функциональность предоставляется драйвером ядра, а не программой, использующей телетайп. Операционная система предоставляет буфер для редактирования текста, а также некоторые простейшие команды редактирования — «удалить символ», «удалить слово», «удалить строку». Все эти функции реализованы в модуле дисциплины линии (line discipline). По умолчанию они включены; такой режим называется каноническим (canonical), или приготовленным (cooked). Программа при желании может отключить эти функции, переведя драйвер в сырой (raw) режим. (Большинство консольных интерактивных программ — текстовые редакторы, почтовые агенты, оболочки, а также все программы, использующие Curses или Readline, — работают в raw-режиме, и сами обрабатывают все команды редактирования). Упомянутый слой протокола также позволяет настраивать эхо (отображение набираемых символов на этом же самом терминале), автоматическую конвертацию признаков конца строки и возврата каретки, и т. п. Таким образом, слой протокола является примитивным разборщиком текста типа Sed, причём работающим в режиме ядра. Смысл выделения описанной выше обработки в отдельный слой заключается в том, что дисциплину (то есть конкретный драйвер этого слоя) можно динамически менять. Например, вместо дисциплины терминала можно включить дисциплину передачи данных с пакетной коммутацией — ppp, IrDA, последовательную мышь и т. д. Как правило, пользователь хочет запустить одновременно несколько программ и взаимодействовать с ними по очереди. Если программа зависает, — пользователь наверняка захочет аварийно завершить[англ.] её. Процессы, работающие в фоновом режиме, должны блокироваться, как только они захотят вывести какой-либо текст на экран. Аналогичным образом набираемый пользователем текст должен передаваться только активной в данный момент программе. Операционная система реализует все эти функции при помощи драйвера TTY. Как уровень дисциплины (протокола), так и драйвер TTY являются пассивными. Иными словами, они не могут сами предпринимать каких-либо действий, а являются лишь набором процедур, которые могут быть вызваны другими процедурами. В отличие от них, сама операционная система является процессом, то есть имеет свой собственный контекст. Система из драйвера UART-порта, дисциплины (протокола) и драйвера TTY называется устройством TTY, или просто TTY. Пользовательский процесс может изменять поведение любого TTY-устройства путём манипулирования соответствующим ему файлом[англ.] в папке /dev. Естественно, для этого данный процесс должен обладать правами записи[англ.] в этот файл. Поэтому, когда пользователь входит в систему[англ.] и подключается к определённому TTY, этот пользователь должен стать владельцем файла, соответствующего этому TTY. Именно это и делает программа login. (Сама программа login запускается от имени суперпользователя). Теперь рассмотрим случай, когда система работает на обычном современном персональном компьютере. Дисциплина и TTY-драйвер работают так же, как и раньше, но драйвера UART-порта уже нет, так как нет телетайпа, который бы через него подключался. Вместо него используется эмулятор видеотерминала — программа, которая имитирует видеотерминал (аналог телетайпа, но с видеоэкраном вместо бумажной ленты), и отображает содержимое этого терминала на экран. При этом эта программа, в отличие от консоли, уже работает в пространстве пользователя[англ.], а не ядра, что обеспечивает куда большую гибкость; например, можно выводить терминал в окне, как это делает Xterm. ПсевдотерминалДля того, чтобы разрешить работу эмулятора терминала в пространстве пользователя и при этом не отказываться от всей вышеописанной подсистемы TTY, был изобретён так называемый псевдотерминал, или PTY. Псевдотерминал может быть запущен внутри другого псевдотерминала; так поступают, например, Screen или клиент Ssh. Графический эмулятор терминала, такой как, например, xterm, первым делом создаёт новый псевдотерминал и дочерний процесс, который становится лидером новой сессии, делает ведомую часть (slave) псевдотерминала своим управляющим терминалом и запускает интерпретатор команд (чаще всего bash или sh). Ведущая часть (master) псевдотерминала используется эмулятором терминала для отображения данных, получаемых от ведомой части. Все процессы, запущенные из интерпретатора, включая и сам интерпретатор, осуществляют ввод (stdin) и вывод (stdout и stderr) через ведомую часть. В Linux для создания псевдотерминала доступно два API ( В первом варианте необходимо открыть файл В случае с BSD в каталоге Место TTY в модели процессовВ данном примере при помощи команды $ ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 500 5942 5928 15 0 12916 1460 wait Ss pts/14 0:00 -/bin/bash
0 500 12235 5942 15 0 21004 3572 wait S+ pts/14 0:01 vim index.php
0 500 12580 12235 15 0 8080 1440 wait S+ pts/14 0:00 /bin/bash -c (ps l) >/tmp/v727757/1 2>&1
0 500 12581 12580 15 0 4412 824 - R+ pts/14 0:00 ps l Колонка STAT в выводе команды ps показывает состояние процесса, но она также может содержать несколько флагов:
Именно эти атрибуты и используются для управления заданиями. Задача драйвера TTY — отслеживать идентификатор активной группы процессов (который явно обновляется ведущим процессом сессии). TTY и система сигналовК TTY имеют непосредственное отношение следующие сигналы:
ПримерРассмотрим следующий пример. Пусть пользователь редактирует текст в консольном текстовом редакторе. Курсор примерно посередине экрана, и редактор как раз занят выполнением задачи, требующей много процессорного времени (например, поиском и заменой слов в большом файле). В этот момент пользователь нажимает Если дисциплина (протокол линии связи) была настроена на перехват этого символа, пользователю не придётся ждать, пока редактор закончит выполнение текущего задания, потому что слой дисциплины мгновенно пошлёт сигнал SIGTSTP активной задаче (то есть активной группе процессов). Причём в эту группу входит не только сам редактор, но и все его дочерние процессы. Пусть редактор настроил ручную обработку сигнала SIGTSTP. Тогда ядро вызывает обработчик прерывания (внутри процесса текстового редактора). Этот обработчик передвигает курсор на последнюю строку на экране, путём записи определённой последовательности управляющих символов в TTY. Так как редактор является активным процессом, эти символы незамедлительно передаются и обрабатываются. Затем редактор посылает сам себе (и своей группе процессов) сигнал SIGSTOP и засыпает. Тот факт, что текстовый редактор заснул, передаётся ведущему процессу сессии при помощи сигнала SIGCHLD (вместе с идентификаторами уснувших процессов). Когда засыпают все процессы активной задачи, ведущий процесс сессии запоминает текущие настройки TTY, и провозглашает себя активной задачей данного TTY при помощи системного вызова Если сейчас вызвать команду Если же вместо этого вызвать команду Настройка TTYУзнать TTY, который управляет данной программной оболочкой, можно при помощи утилиты Открытый TTY можно настроить при помощи TTY можно также настроить прямо из консоли, используя утилиту $ stty -a
speed 38400 baud; rows 73; columns 238; 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 -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Далее перечисляются спецсимволы, а в конце — выбранные в настоящий момент опции. Тире означает, что опция отключена. ПримерыЕсли открыть окно Xterm, запомнить его TTY (вызвав команду Если в окне Xterm набрать Иногда в UNIX-системе не работает кнопка backspace. Это происходит потому, что эмулятор терминала посылает в TTY не тот ASCII-код, которому в этом TTY назначена функция Если в окне Xterm набрать Если в окне Xterm набрать Если в окне Xterm набрать Команда Больше информации можно найти в системе Примечания
Источник
|
Portal di Ensiklopedia Dunia