Термінальні емулятори
Основна сторона замінює лінію (пару проводів TX / RX), яка йде до терміналу.
Термінал відображає символи, які він отримує по одному з проводів (деякі з них є керуючими символами і змушують його робити такі дії, як переміщення курсору, зміна кольору ...) і надсилає на інший провід символи, відповідні клавішам, які ви вводите.
Емулятори терміналів, такі як xterm, не відрізняються, за винятком того, що замість того, щоб надсилати та приймати символи по проводах, вони читають і записують символи у своєму дескрипторі файлів на головну сторону. Після того, як вони породили невільницький термінал і запустили вашу оболонку на цьому, вони більше не торкаються цього. На додаток до емуляції пари дроту, xterm також може змінити деякі властивості дисципліни рядків через дескриптор файлу на головну сторону. Наприклад, вони можуть оновити атрибути розміру, щоб SIGWINCH був надісланий програмам, які взаємодіють з підлеглим pty, щоб повідомити їх про змінений розмір.
Крім цього, в емуляторі термінала / терміналу мало інтелекту .
Те, що ви записуєте на термінальний пристрій (як-от pty slave), - це те, що ви маєте на увазі, щоб його відображали, те, що ви читаєте з нього, це те, що ви там ввели, тому для емулятора термінала немає сенсу читати чи записувати в це . Вони є на іншому кінці.
Дисципліна тти лінії
Багато інтелекту знаходиться в с TTY дисципліни лінії . Дисципліна лінійки - це програмний модуль (що знаходиться у драйвері, у ядрі), що надходить на послідовний / pty пристрій, що сидить між цим пристроєм та лінією / провідом (головна сторона для pty).
Послідовна лінія може мати термінал на іншому кінці, але також миша або інший комп'ютер для мереж. Можна, наприклад, приєднати дисципліну SLIP, щоб отримати мережевий інтерфейс поверх послідовного пристрою (або pty пристрою), або у вас може бути дисципліна в рядку tty . Дисципліна tty line - це дисципліна за замовчуванням, принаймні на Linux для послідовних та pty пристроїв. В Linux ви можете змінити дисципліну ліній ldattach
.
Ви можете побачити ефект відключення дисципліни tty line, видавши stty raw -echo
(зауважте, що bash-підказка чи інші інтерактивні програми, такі як vi
встановити термінал у потрібному режимі, який їм потрібен, тому ви хочете використовувати тупу програму, як cat
це досвід із цим). Потім все, що записується на підлеглий термінальний пристрій, робить його негайно на головну сторону для xterm для читання, і кожен символ, записаний xterm на головну сторону, одразу стає доступним для читання з підлеглого пристрою.
Дисципліна ліній - це те, де реалізований внутрішній редактор ліній термінального пристрою . Наприклад, з stty icanon echo
(як це за замовчуванням), коли ви вводите a
xterm записує a
до головного, тоді дисципліна рядків повторює його назад (робить a
доступним для читання за допомогою xterm
дисплея), але не робить нічого доступним для читання на стороні підлеглого . Потім, якщо ви вводите backspace, xterm надсилає a ^?
або ^H
символ, дисципліна лінії (як така ^?
або ^H
відповідає erase
налаштуванню дисципліни рядка) надсилає назад на майстер a ^H
, space
а також ^H
для xterm
видаленняa
Ви щойно набрали на його екрані і досі нічого не надсилає додатку, що читає програму з підлеглого, він просто оновлює свій внутрішній буфер редактора рядків, щоб видалити те, що a
ви ввели раніше.
Потім, коли ви натискаєте клавішу Enter, xterm надсилає ^M
(CR), яка дисципліна ліній перетворює при вході в ^ J (LF), і надсилає те, що ви ввели до цього часу для читання на стороні підлеглого (додаток для читання додатка /dev/pts/x
отримає те, що ви набрали включно LF, але не з того a
часу, як ви його видалили), а на головній стороні він надсилає CR та LF для переміщення курсору до наступного рядка та початку екрана.
Лінія дисципліни також відповідає за передачу SIGINT
сигналу до групи переднього плану терміналу, коли він приймає ^C
символ з боку головного і т.д.
Багато інтерактивних термінальних додатків забороняють більшість функцій цієї лінійки дисципліни реалізовувати її самостійно. Але в будь-якому випадку, майте на увазі, що термінал ( xterm
) мало в цьому бере участь (крім показу того, що йому наказано відображати).
І може бути лише один сеанс на процес та на один термінальний пристрій. До сеансу може бути приєднаний контрольний термінал, але це не обов'язково (всі сеанси починаються без терміналу, поки не відкриються). xterm
, у процесі, який він має для виконання вашої оболонки, як правило, створить новий сеанс (і тому від'єднається від терміналу, з якого ви запустили, xterm
якщо такий є), відкрийте новий, який /dev/pts/x
він породив, приєднавши цей термінальний пристрій до нового сеансу. Потім він виконає вашу оболонку в цьому процесі, тому ваша оболонка стане лідером сесії. Ваша оболонка або будь-яка інтерактивна оболонка під час сеансу зазвичай перемикається з групами процесів і tcsetpgrp()
встановлює передній план та фонові завдання для цього терміналу.
Що стосується того, яку інформацію зберігає термінальний пристрій з чіткими дисциплінами (послідовними або pty) , то це, як правило, stty
команда відображає та модифікує. Вся конфігурація дисципліни: розмір екрана терміналу, локальний, вхідні прапори виводу, настройки для спеціальних символів (наприклад, ^ C, ^ Z ...), швидкість введення та виведення (не стосується ptys). Це відповідає tcgetattr()
/ tcsetattr()
функціям, які в Linux відображають TCGETS
/ TCSETS
ioctls, та TIOCGWINSZ
/ TIOCSWINSZ
для розміру екрана. Ви можете стверджувати, що поточна група процесу переднього плану - це інша інформація, що зберігається в термінальному пристрої ( tcsetpgrp()
/ tcgetpgrp()
, TIOC{G,S}PGRP
йоктлі), або поточному буфері вводу або виводу.
Зауважте, що інформація про розмір екрану, що зберігається в термінальному пристрої, може не відображати реальність. Термінальний емулятор зазвичай встановлює його (через той самий ioctl на головний розмір), коли його вікно змінюється за розміром, але він може вийти з синхронізації, якщо програма викликає ioctl на стороні підлеглого або коли розмір не передається (у випадку з'єднання ssh, що означає інший pty, породжений, sshd
якщо, наприклад, ssh
ігнорує SIGWINCH
). Деякі термінали також можуть запитувати їх розмір за допомогою послідовностей евакуації, тому програма може запитувати його таким чином і оновлювати дисципліну рядків за допомогою цієї інформації.
Для отримання більш детальної інформації, наприклад, ви можете подивитися на сторінках termios
і tty_ioctl
man на Debian.
Грати з іншими лінійками:
Емуляція миші псевдотерміналом:
socat pty,link=mouse fifo:fifo
sudo inputattach -msc mouse # sets the MOUSE line discipline and specifies protocol
xinput list # see the new mouse there
exec 3<> fifo
printf '\207\12\0' >&3 # moves the cursor 10 pixels to the right
Вище головна частина pty закінчується socat на названій трубі ( fifo
). Ми підключаємо цю фіфою до процесу (оболонки), який записує 0x87 0x0a 0x00, що в протоколі системи миші означає no button pressed, delta(x,y) = (10,0)
. Тут ми (оболонка) наслідуємо не термінал, а мишею, 3-х байт, які ми надсилаємо, не повинні читатись (потенційно перетворюватися) додатком із термінального пристрою ( mouse
над яким - це посилання, зроблене яким- socat
небудь /dev/pts/x
пристроєм) , але слід інтерпретувати як подія введення миші.
Створіть інтерфейс SLIP:
# on hostA
socat tcp-listen:12345,reuseaddr pty,link=interface
# after connection from hostB:
sudo ldattach SLIP interface
ifconfig -a # see the new interface there
sudo ifconfig sl0 192.168.123.1/24
# on hostB
socat -v -x pty,link=interface tcp:hostA:12345
sudo ldattach SLIP interface
sudo ifconfig sl0 192.168.123.2/24
ping 192.168.123.1 # see the packets on socat output
Вище, послідовний провід емулюється socat
як TCP-розетка між хостомA і хостомB. Дисципліна ліній SLIP інтерпретує ті байти, що обмінюються над цією віртуальною лінією, як IPIP капсульовані IP-пакети для доставки по sl0
інтерфейсу.