Термінальні емулятори
Основна сторона замінює лінію (пару проводів 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(як це за замовчуванням), коли ви вводите axterm записує 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/ TCSETSioctls, та TIOCGWINSZ/ TIOCSWINSZдля розміру екрана. Ви можете стверджувати, що поточна група процесу переднього плану - це інша інформація, що зберігається в термінальному пристрої ( tcsetpgrp()/ tcgetpgrp(), TIOC{G,S}PGRPйоктлі), або поточному буфері вводу або виводу.
Зауважте, що інформація про розмір екрану, що зберігається в термінальному пристрої, може не відображати реальність. Термінальний емулятор зазвичай встановлює його (через той самий ioctl на головний розмір), коли його вікно змінюється за розміром, але він може вийти з синхронізації, якщо програма викликає ioctl на стороні підлеглого або коли розмір не передається (у випадку з'єднання ssh, що означає інший pty, породжений, sshdякщо, наприклад, sshігнорує SIGWINCH). Деякі термінали також можуть запитувати їх розмір за допомогою послідовностей евакуації, тому програма може запитувати його таким чином і оновлювати дисципліну рядків за допомогою цієї інформації.
Для отримання більш детальної інформації, наприклад, ви можете подивитися на сторінках termiosі tty_ioctlman на 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інтерфейсу.