如果您启动终端并调用可执行文件(为了简单起见,假设是面向行的),您会从可执行文件中得到对该命令的答复。这是如何打印给您(用户)的?终端会做类似的事情吗pexpect
? (轮询等待输出)还是什么?它如何得到要打印的输出的通知?终端如何启动程序? (它类似于 python 的 os.fork() 吗?)我很困惑终端是如何工作的,我一直在玩一些终端模拟器,但我仍然不明白所有这些魔法是如何工作的。我正在查看 konsole (kde) 和 yakuake (可能使用 konsole) 的来源,但我不知道所有这些魔法发生的地方。
答案1
当您“打开终端”时,您正在启动一个终端仿真器程序,例如 xterm、gnome-terminal、lxterm、konsole 等。
终端仿真器要做的第一件事就是分配一个伪终端(通常称为伪 tty,简称 pty)。 pty 是一对字符设备文件:pty master(终端仿真器打开的一侧)和pty Slave(终端内运行的程序打开的一侧)。在大多数现代单机上,主机是/dev/ptmx
(每个终端模拟器都打开)并且从属设备是/dev/pts/NUMBER
.伪终端的内核驱动程序跟踪哪个进程控制每个从设备的主设备。终端仿真器可以通过读写控制在主设备上。
一旦终端模拟器打开主设备,它就会启动一个子进程(通常是一个 shell,但由调用终端模拟器的用户决定)。模拟器以调用程序的通常方式执行此操作:
当子进程(或任何其他进程)写入 pty 从属进程时,模拟器会看到 pty 主进程上的输入。
相反,当仿真器写入主设备时,它被视为从设备上的输入。
Expect 的工作方式完全相同。 Expect 和 xterm 等终端仿真器之间的区别在于它们从何处获取向程序提供的输入(脚本与键盘输入)以及它们如何处理输出(日志文件或解析器与在窗口中绘制文本)。
答案2
最初你只有愚蠢的终端 - 起初实际上是电传打字机(类似于电动打字机,但带有一卷纸)(因此 /dev/tty - TeleTYpers),但后来是屏幕+键盘组合 - 它只是发送一个键码到计算机,计算机发回一条在终端上写入该字母的命令(即终端没有本地回显,计算机必须命令终端写入用户在终端上键入的内容) - 这是原因之一为什么这么多重要的 Unix 命令都这么短。大多数终端都是通过串行线连接的,但(至少)有一个终端直接连接到计算机(通常在同一个房间) - 这是控制台。只有少数用户被信任可以在“控制台”上工作(这通常是单用户模式下唯一可用的“终端”)。
xterm
后来也出现了一些带有屏幕和图形屏幕卡、键盘、鼠标和简单处理器的图形终端(所谓的“xterminals”,不要与程序混淆);它只能运行一个 X 服务器。他们自己不进行任何计算,因此 X 客户端在它们连接的计算机上运行。有些有硬盘,但它们也可以通过网络启动。它们在 20 世纪 90 年代初很流行,当时个人电脑还没有变得如此便宜和强大。
再后来,出现了“智能”或“智能”终端。智能终端有能力过程用户输入(在 shell 提示符下进行行编辑,例如插入字符、使用 删除单词、使用或Ctrl-W
删除字母)Ctrl-H
Backspace
不靠别人帮助从计算机。另一方面,早期的哑终端无法执行此类现场行编辑。在哑终端上,当用户按下某个键时,终端会将生成的键代码发送/委托给计算机进行处理。处理后,计算机将结果发送回哑终端进行显示(例如,按下Ctrl-W
将向计算机发送一个键码,计算机会将其解释为“删除最后一个单词”,因此计算机将处理该文本改变,然后简单地给哑终端它应该显示的输出)。
xterm
“终端模拟器”——您用或等程序打开的“终端窗口” konsole
——试图模仿此类智能终端的功能。 (Windows)等程序也PuTTY
可以模拟这些智能终端仿真器。
对于 PC,“控制台”(键盘+屏幕)和“计算机”更像是一个单元,您可以使用“虚拟终端”(在 Linux 上,按 Alt+F1 到 Alt+F6 键),但这些也模仿老式终端。当然,随着 Unix/Linux 越来越成为由单个用户使用的桌面操作系统,您现在可以在“控制台”完成大部分工作,以前的用户使用通过串行线连接的终端。
当然是启动程序的 shell。它使用fork
系统调用(C 语言)使用环境设置复制自身,然后exec
使用系统调用将此副本转换为您想要运行的命令。 shell 将挂起(除非该命令在后台运行),直到命令完成。由于该命令继承了以下设置标准输入,标准输出和标准错误在 shell 中,该命令将写入终端屏幕并接收来自终端键盘的输入。