Як працює термінал Linux?


32

Якщо ви запустили термінал і викликаєте виконуваний файл (якщо припустити, що це лінія, орієнтована на простоту), ви отримаєте відповідь на команду з виконуваного файлу. Як це друкується вам (користувачеві)? Чи робить термінал щось подібне pexpect? (опитування очікує на вихід) чи що? Як отримують повідомлення про вихід, який слід роздрукувати? І як термінал запускає програму? (Це щось схоже на os.fork python ()?) Я спантеличений тим, як працює термінал, я грав у якомусь емуляторі терміналу, і досі не розумію, як працює ця магія. Я дивлюся на джерело konsole (kde) та yakuake (можливо, використовує konsole), і я не можу дістатись, де відбувається вся ця магія.


6
Погляньте на простий термінальний емулятор та просту операційну систему іграшок із простою оболонкою (та перші п'ятнадцять сторінок книги). Також прочитайте цю відповідь на пов’язане питання.

2
Це посилання також перекладається на тему терміналу та історію tty: linusakesson.net/programming/tty/index.php

@nwildner cool,
Майк

Відповіді:


30

Спочатку у вас були просто тупі термінали - спочатку насправді телерайт-машинок (схожий на електричну друкарську машинку, але з рулоном паперу) (отже / dev / tty - TeleTYpers), але пізніше екран + клавіатура-комбо - що тільки що надіслав ключ-код на комп'ютер і на комп’ютер відіслали команду, яка написала лист на терміналі (тобто термінал був без локального відлуння; комп'ютер повинен був замовити термінал, щоб написати те, що користувач набрав на терміналі) - це одна з причин чому стільки важливих команд Unix такі короткі. Більшість терміналів були підключені послідовними лініями, але (принаймні) один був безпосередньо підключений до комп’ютера (часто це ж приміщення) - це була консоль. Працювати над "консоллю" довіряли лише декілька користувачів (часто це був єдиний "термінал", доступний в режимі для одного користувача).

Пізніше з'явилися деякі графічні термінали (так звані "xterminals", не плутати з програмою xterm) з екраном і графічною екраною -карткою, клавіатурою, мишею і простим процесором; який міг би просто запустити X-сервер. Вони самі не проводили жодних обчислень, тому X-клієнти бігали за комп'ютером, до якого вони були підключені. У деяких були жорсткі диски, але вони також могли завантажуватися через мережу. Вони були популярні на початку 1990-х, перш ніж ПК стали настільки дешевими та потужними.

"Емулятор терміналу" - "вікно-термінал", яке ви відкриваєте за допомогою таких програм, як xtermабо, konsoleнамагається імітувати функціональність таких німих терміналів. Також такі програми, як PuTTY(Windows), емулюють термінали.

На ПК, де "консоль" (клавіатура + екран) та "комп'ютер" - це більше єдиний блок, ви отримали "віртуальні термінали" (в Linux, клавіші Alt + F1 через Alt + F6), але вони теж імітують термінали старого стилю. Звичайно, коли Unix / Linux стає все більш настільною операційною системою, яку часто використовує окремий користувач, тепер ви виконуєте більшу частину своєї роботи "за консоллю", де користувачі раніше використовували термінали, з'єднані послідовними лініями.


Це звичайно оболонка, яка запускає програми. І він використовує fork-systemcall (мова C), щоб зробити копію себе з налаштуваннями середовища, тоді exec-systemcall використовується для перетворення цієї копії в команду, яку ви хотіли запустити. Оболонка призупиняється (якщо команда не виконується у фоновому режимі), поки команда не буде виконана. Оскільки команда успадковує параметри для stdin, stdout та stderr від оболонки, команда запише на екран терміналу і отримає вхід з клавіатури терміналу.


А між тупими серійними терміналами та Xterms був en.wikipedia.org/wiki/Blit_(computer_terminal)
sendmoreinfo

31

Коли ви "відкриваєте термінал", ви запускаєте програму емулятора терміналу, наприклад xterm, gnome-terminal, lxterm, konsole, ...

Одне з перших речей, що робить емулятор терміналу - це виділити псевдотермінал (його часто називають псевдо-tty, або pty для короткого). Pty - це пара файлів символьних пристроїв : майстер pty, який є стороною відкриття емулятора терміналу, і pty slave, яка є стороною, у якій відкриті програми, запущені всередині терміналу. У більшості сучасних уніцій майстер є /dev/ptmx(яким є відкритий кожен емулятор терміналу) і підлеглий /dev/pts/NUMBER. Драйвер ядра для псевдотерміналів відслідковує, який процес управляє ведучим для кожного веденого пристрою. Термінальний емулятор може отримати шлях до відповідного веденого через ioctl на головний пристрій.

Після того, як емулятор терміналу відкрив головний пристрій, він запускає підпроцес (як правило, оболонку, але вирішувати повинен користувач, який викликав емулятор терміналу). Емулятор робить це звичайним чином, щоб викликати програму:

  • розщедрити дочірній процес,
  • відкрити підлеглий pty пристрій на дескрипторах файлів 0, 1 і 2 (стандартний вхід, стандартний вихід і потік помилок),
  • виконати оболонку або іншу програму в дочірньому процесі.

Коли дитина (або будь-який інший процес) записує в pty підлеглий, емулятор бачить вхід на pty master.

І навпаки, коли емулятор записує на головний пристрій, це сприймається як вхід на підлеглий.

Очікуйте, що працює точно так само. Різниця між епілятором Expect і емулятором терміналу, таким як xterm, полягає в тому, де вони отримують вхід, який вони подають програму (сценарій проти введення на клавіатурі), і те, що вони роблять з висновком (файл журналу або парсер проти малювання тексту у вікні).


Одним із простих прикладів того, що тут описано, є реалізація scriptкоманди BusyBox , де xgetptyфункція є ядром роботи /dev/ptmx.
Руслан

@Tim Я ціную, що англійська мова не є твоєю рідною мовою. Але якщо ви редагуєте публікацію, переконайтеся, що ви не помилилися. Якщо ви цього не розумієте, не редагуйте. Крім того, ще раз, не використовуйте жирного шрифту, щоб виділити речі, які не потребують виділення.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.