Linux终端如何工作?


32

如果启动一个终端并调用一个可执行文件(为简单起见,假设它是面向行的),您将从可执行文件中得到对该命令的答复。如何打印给您(用户)?终端会做类似的事情pexpect吗?(轮询等待输出)还是什么?如何通知要输出的输出?终端如何启动程序?(这类似于python的os.fork()吗?)我不知道终端的工作方式,我一直在使用一些终端仿真器,但我仍然不了解所有这些魔术如何工作。我正在查看konsole(kde)和yakuake(可能使用konsole)的来源,我无法了解发生所有魔术的地方。


6
看一看一个简单的终端模拟器一个带有简单外壳的简单玩具操作系统(以及本书的前十五页左右)。另外,请阅读有关相关问题的答案

2
该链接还涉及终端主题和tty历史:linusakesson.net/programming/tty/index.php

@nwildner酷,
麦克,

Answers:


30

最初您只是笨拙的终端-最初实际上是电传打字机(类似于电动打字机,但带有一卷纸)(因此/ dev / tty-TeleTYpers),但后来出现了screen + keyboard-combos-仅发送了一个键码到计算机,计算机发送回在终端上写字母的命令(即终端没有本地回显,计算机必须命令终端写用户在终端上键入的内容)-这是原因之一为什么这么多重要的Unix命令这么短。大多数终端是通过串行线路连接的,但是(至少)一个终端直接连接到计算机(通常是同一房间)–这就是控制台。仅信任少数几个用户在“控制台”上工作(这通常是单用户模式下唯一可用的“终端”)。

后来还出现了一些图形终端(所谓的“ xterminals”,不要与-program相混淆xterm),它们带有屏幕和图形屏幕卡,键盘,鼠标和一个简单的处理器。可以只运行一个X服务器。他们自己不进行任何计算,因此X客户端在他们连接的计算机上运行。有些装有硬盘,但也可以通过网络引导。它们在1990年代初期流行,当时PC变得如此便宜和强大。

“终端仿真器”(即使用诸如xterm或等程序打开的“终端窗口”)konsole试图模仿此类哑终端的功能。PuTTY(Windows)之类的程序也会模拟终端。

在PC上,“控制台”(键盘+屏幕)和“计算机”更多地是一个单元,您获得了“虚拟终端”(在Linux上,通过Alt + F1到Alt + F6键),但是这些也是模仿老式终端。当然,随着Unix / Linux逐渐成为单一用户经常使用的桌面操作系统,您现在可以在“控制台”上完成大部分工作,在此之前,用户使用的终端是通过串行线路连接的。


当然,这是启动程序的外壳。并且它使用fork-systemcall(C语言)使用环境设置来复制自身,然后使用exec-systemcall将其转换为您要运行的命令。Shell会挂起(除非命令在后台运行),直到命令完成。由于该命令从shell继承了stdin,stdout和stderr的设置,因此该命令将写入终端的屏幕并从终端的键盘接收输入。


而在哑串行终端和xterm终端之间有en.wikipedia.org/wiki/Blit_(computer_terminal)
sendmoreinfo

31

当“打开终端”时,您正在启动终端仿真器程序,例如xterm,gnome-terminal,lxterm,konsole等。

终端仿真器要做的第一件事之一就是分配一个伪终端(通常称为伪tty,简称pty)。pty是一对字符设备文件:pty主站(这是终端仿真器打开的那一侧)和pty从站(这是在终端内部运行的程序的那一侧)。在大多数现代的unice上,主服务器是/dev/ptmx(每个终端仿真器都打开的),从服务器是/dev/pts/NUMBER。伪终端的内核驱动程序跟踪哪个进程控制着每个从设备的主机。终端仿真器可以通过主设备上的ioctl检索到相应从设备的路径。

终端仿真器打开主设备后,它将启动一个子进程(通常是一个外壳程序,但这取决于调用终端仿真器的用户来决定)。仿真器以通常的方式执行此操作以调用程序:

  • 派生一个子进程,
  • 在文件描述符0、1和2(标准输入,标准输出和错误流)上打开从属pty设备,
  • 在子进程中执行外壳程序或其他程序。

当子进程(或任何其他进程)写入pty从站时,仿真器将看到pty主站上的输入。

相反,当仿真器写入主设备时,它被视为从设备上的输入。

Expect的工作方式完全相同。Expect与终端仿真器(例如xterm)之间的区别在于,它们在何处获得输入程序的输入(脚本与键盘输入),以及输出的处理方式(日志文件或解析器与窗口中的绘图文本)。


这里描述的简单示例之一是BusyBox的script命令实现,其中xgetpty功能是的核心/dev/ptmx
Ruslan

@Tim我很感谢英语不是您的母语。但是,如果您编辑帖子,请确保您没有记错。如果您不理解,请不要编辑。另外,请再次不要使用粗体突出显示不需要突出显示的内容。
吉尔(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.