Как работает терминал Linux?

32

Если вы запустите терминал и вызовете исполняемый файл (если он для простоты ориентирован на строку), вы получите ответ на команду из исполняемого файла. Как это распечатывается для вас (пользователя)? Терминал делает что-то подобное pexpect? (опрос в ожидании выхода) или как? Как он получает уведомление о выводе на печать? А как терминал запускает программу? (Это что-то похожее на os.fork ()?) Я озадачен тем, как работает терминал, я играл с каким-то эмулятором терминала и до сих пор не понимаю, как работает вся эта магия. Я смотрю на источник konsole (kde) и yakuake (возможно, использует konsole) и не могу понять, где происходит вся эта магия.

Майк
источник
6
Взгляните на простой эмулятор терминала и простую игрушечную операционную систему с простой оболочкой (и первые пятнадцать или около того страниц этой книги). Кроме того, прочитайте этот ответ на связанный вопрос.
2
Эта ссылка также представляет интерес для терминальной темы и истории tty: linusakesson.net/programming/tty/index.php
@nwildner круто,
Майк
1
Смотрите также, что хранится в файлах / dev / pts и можем ли мы их открыть?
Жиль "ТАК - перестань быть злым"

Ответы:

30

Изначально у вас были просто тупые терминалы - сначала на самом деле пишущие машинки (похожие на электрическую пишущую машинку, но с рулоном бумаги) (отсюда / dev / tty - TeleTYpers), но позже screen + клавиатурные комбинации - которые только что отправили код клавиши на компьютер, и компьютер отправил обратно команду, которая написала письмо на терминале (т.е. терминал был без локального эха, компьютер должен был заказать терминал, чтобы написать то, что пользователь набрал на терминале) - это одна из причин почему так много важных Unix-команд такие короткие. Большинство терминалов были соединены последовательными линиями, но (по крайней мере) один был напрямую подключен к компьютеру (часто в одной комнате) - это была консоль. Лишь немногим избранным пользователям было доверено работать с «консолью» (это часто был единственный «терминал», доступный в однопользовательском режиме).

Позже также были некоторые графические терминалы (так называемые «xterminals», которые не следует путать с xterm-program) с экраном и графическим экраном, клавиатурой, мышью и простым процессором; который мог просто запустить 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 master, который является стороной, которую открывает эмулятор терминала, и pty slave, который является стороной, которую открывают программы, работающие внутри терминала. В большинстве современных устройств ведущий - это /dev/ptmx(который открыт у каждого эмулятора терминала), а ведомый - это /dev/pts/NUMBER. Драйвер ядра для псевдо-терминалов отслеживает, какой процесс управляет мастером для каждого подчиненного устройства. Эмулятор терминала может получить путь к соответствующему ведомому устройству через ioctl на главном устройстве.

После того, как эмулятор терминала открыл главное устройство, он запускает подпроцесс (обычно оболочку, но решать должен пользователь, который вызвал эмулятор терминала). Эмулятор делает это обычным способом для вызова программы:

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

Когда дочерний процесс (или любой другой процесс) пишет в ведомый pty, эмулятор видит ввод в ведущем устройстве pty.

И наоборот, когда эмулятор выполняет запись на ведущее устройство, оно рассматривается как ввод на ведомом устройстве.

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

Жиль "ТАК - перестань быть злым"
источник
Одним из простых примеров того , что описано здесь реализация BusyBox в части scriptкоманды , где xgetptyфункция является основой работы с /dev/ptmx.
Руслан
@ Я ценю, что английский не твой родной язык. Но если вы редактируете сообщение, убедитесь, что вы не ошиблись. Если вы этого не понимаете, не редактируйте. Кроме того, еще раз, пожалуйста, не используйте жирный шрифт, чтобы выделить вещи, которые не нуждаются в выделении.
Жиль "ТАК - перестать быть злым"