如果启动一个终端并调用一个可执行文件(为简单起见,假设它是面向行的),您将从可执行文件中得到对该命令的答复。如何打印给您(用户)?终端会做类似的事情pexpect
吗?(轮询等待输出)还是什么?如何通知要输出的输出?终端如何启动程序?(这类似于python的os.fork()吗?)我不知道终端的工作方式,我一直在使用一些终端仿真器,但我仍然不了解所有这些魔术如何工作。我正在查看konsole(kde)和yakuake(可能使用konsole)的来源,我无法了解发生所有魔术的地方。
如果启动一个终端并调用一个可执行文件(为简单起见,假设它是面向行的),您将从可执行文件中得到对该命令的答复。如何打印给您(用户)?终端会做类似的事情pexpect
吗?(轮询等待输出)还是什么?如何通知要输出的输出?终端如何启动程序?(这类似于python的os.fork()吗?)我不知道终端的工作方式,我一直在使用一些终端仿真器,但我仍然不了解所有这些魔术如何工作。我正在查看konsole(kde)和yakuake(可能使用konsole)的来源,我无法了解发生所有魔术的地方。
Answers:
最初您只是笨拙的终端-最初实际上是电传打字机(类似于电动打字机,但带有一卷纸)(因此/ 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,gnome-terminal,lxterm,konsole等。
终端仿真器要做的第一件事之一就是分配一个伪终端(通常称为伪tty,简称pty)。pty是一对字符设备文件:pty主站(这是终端仿真器打开的那一侧)和pty从站(这是在终端内部运行的程序的那一侧)。在大多数现代的unice上,主服务器是/dev/ptmx
(每个终端仿真器都打开的),从服务器是/dev/pts/NUMBER
。伪终端的内核驱动程序跟踪哪个进程控制着每个从设备的主机。终端仿真器可以通过主设备上的ioctl检索到相应从设备的路径。
终端仿真器打开主设备后,它将启动一个子进程(通常是一个外壳程序,但这取决于调用终端仿真器的用户来决定)。仿真器以通常的方式执行此操作以调用程序:
当子进程(或任何其他进程)写入pty从站时,仿真器将看到pty主站上的输入。
相反,当仿真器写入主设备时,它被视为从设备上的输入。
Expect的工作方式完全相同。Expect与终端仿真器(例如xterm)之间的区别在于,它们在何处获得输入程序的输入(脚本与键盘输入),以及输出的处理方式(日志文件或解析器与窗口中的绘图文本)。