终端的前世今生

Linux系统启动后,如果没有安装图形桌面系统,用户看到的是黑乎乎的屏幕; 根据提示输入用户名和密码后,用户可以通用命令行控制电脑执行任务。如果是登陆到了图形桌面系统,用户可以打开xterm、gnome-terminal或者konsole输入指令。有人说命令行是Linux系统难以使用以致无法普及的根源; 也有人说命令行是Linux系统的魅力所在。远离这些无意义的争论不谈,掌握命令行才能发挥Linux最大的威力。

终端(Terminal)是命令行界面的硬件层面和软件层面的载体。它与计算机关系密切,其历史可以追溯到计算机诞生之初,也随着计算机的发展而发生变化。

实体终端

终端的前世今生_第1张图片
vt100_terminal_all.png

计算机在早期不是面向个人的,而是作为服务器为某个组织、机构甚至整个国家服务的。用户需要一个终端,通用串口线或电话线与计算机相连,才能登陆进去执行自己的伟大的计算工作; 不知道那时的程序员是否已经弄出来了游戏程序,忙里偷闲的时候,在终端里玩的不亦乐乎。

终端是一种通过字符与计算机进行信息沟通的设备,包括输入、显示、通信和处理模块等部分。终端的通信模块与计算机相连,提供终端与计算机之间的双向通信链路; 用户输入的信息通过该链路到达计算机,计算机返回的数据通过该链路到达终端,终端负责将这些显示出来。

计算机看到的是一个通信端口,但是仅仅在软件上实现通信的驱动功能是不够的,因为终端的种类很多,它们实现换行、字符颜色等特殊功能时需要在向终端发送不同的指令;所以,计算机还需要实现终端的驱动,构建设备文件 /dev/ttyX。设备文件/dev/ttyX为用户提供了针对终端的统一端口,编程时程序员可以忽略用户所使用的终端的具体型号,执行统一的文件操作完成终端的输入读取或输出显示内容;还可以使用系统调用ioctl或C语言库termios控制终端的行为。

Framebuffer终端

终端的前世今生_第2张图片
framebuffer-console.png

随着个人计算机的发展,每台计算机都配置着显示器和键盘,终端成为计算机的标配。把Linux系统启动或切换到命令行界面,看到的就是计算机自身的终端,这种终端是Linux系统基于FrameBuffer实现的。FrameBuffer是Linux系统图形系统的抽象层,用于控制显示器上显示的内容。/dev/fb0是FrameBuffer设备的设备文件。执行下面的指令

cat /dev/urandom > /dev/fb0

会将屏幕变成一个满是噪声的样子。

终端模拟器

终端的前世今生_第3张图片
gnome-terminal.png

在Linux图形桌面中,打开的终端,比如xterm, gnome-terminal和konsole等,也是一种终端。但是,它们一般被成为终端模拟器(Terminal Emulator),因为它们都是使用软件模拟出的终端。终端的显示部分基于X Window系统实现的。

这些终端模拟器对应的终端设备一般成为Pseudoterminal,其设备文件位于/dev/pts/X中。在终端中,使用tty命令,可以得到当前终端对应的终端设备文件。对终端设备文件进行操作,可以实现一些有趣的结果。

终端的前世今生_第4张图片
terminal-talk.png

打开两个终端,A对应的终端设备文件为/dev/pts/0,B对应的终端设备文件为/dev/pts/1。在终端A中,执行echo message > /dev/pts/1,会在终端B中显示出message信息。基于这个功能,可以实现不同终端的用户之间进行聊天。

其他

另一个与终端形影相随的东西是shell程序,比如sh,bash,zsh等;它负责进程的管理,比如后台运行、终止程序等,这个过程背后有一套复杂的结构,后面有时间可详细了解;可同时参考script程序,它与Shell有着相同的基本原理。

参考文献

  • Terminally confused
  • Text Terminal HOW-TO
  • The TTY demystified
  • A Deep Dive into the SIGTTIN / SIGTTOU Terminal Access Control Mechanism in Linux

你可能感兴趣的:(终端的前世今生)