1. Linux TTY设备的基本概念
在Linux系统中,TTY(Teletypewriter)是一种提供字符输入和输出的设备接口。TTY设备可以是物理设备,比如终端机,也可以是虚拟设备,比如控制台和终端仿真器。它们允许用户通过命令行界面与系统进行交互。
1.1 物理TTY设备
物理TTY设备通常包括终端机、串口等。历史上,计算机和终端机通过串口进行连接。用户可以在终端机上输入命令并获得输出结果。在Linux系统中,物理TTY设备对应着文件设备节点,在/sys/class/tty/目录下可以找到相应的节点文件。
$ ls -l /sys/class/tty/
total 0
lrwxrwxrwx 1 root root 0 Aug 19 10:30 console -> ../../devices/virtual/tty/console
lrwxrwxrwx 1 root root 0 Aug 19 10:30 tty0 -> ../../devices/virtual/tty/tty0
lrwxrwxrwx 1 root root 0 Aug 19 10:30 tty1 -> ../../devices/virtual/tty/tty1
lrwxrwxrwx 1 root root 0 Aug 19 10:30 tty2 -> ../../devices/pci0000:00/0000:00:12.0/0000:02:02.0/tty/tty2
lrwxrwxrwx 1 root root 0 Aug 19 10:30 tty3 -> ../../devices/pci0000:00/0000:00:12.0/0000:02:02.0/tty/tty3
在/sys/class/tty/目录下,可以看到console和tty0-tty3这些文件。console文件是当前控制台的符号链接,指向/sys/devices/virtual/tty/console目录。而tty0-tty3则分别对应了终端设备ttyS0-ttyS3。通过这些文件,可以得到有关TTY设备的一些信息,比如设备类型、端口等。
1.2 虚拟TTY设备
虚拟TTY设备是在内存中模拟的终端设备,用于提供字符输入和输出的接口。在Linux系统中,控制台和终端仿真器就是虚拟TTY设备的例子。
2. Linux TTY设备的工作原理
Linux TTY设备的工作原理涉及到几个重要的概念,包括行规范和终端驱动。
2.1 行规范
在Linux系统中,每个TTY设备都有一个关联的行规范,控制字符输入和输出的方式。行规范包括了一些重要的属性,比如输入、输出和控制标志,以及终端设备的状态信息。
2.2 终端驱动
终端驱动是一个内核模块,负责控制TTY设备的输入和输出。它通过维护一个输入队列和输出队列来处理字符的输入和输出。当用户输入字符时,终端驱动会将字符放入输入队列中,并通知应用程序来读取。当应用程序将字符写入终端设备时,终端驱动将字符放入输出队列,并通知设备将字符发送到显示屏上。
终端设备的文件描述符是用来访问TTY设备的接口。通过打开和关闭设备文件,应用程序可以与终端设备进行交互。
3. Linux TTY设备的奥秘
Linux TTY设备有一些奇妙的特性,使其成为系统中一个特殊而强大的组件。
3.1 多路复用
TTY设备支持多路复用,即多个应用程序可以同时访问同一个TTY设备。这是因为终端驱动使用了输入和输出队列来处理字符的输入和输出,不同的应用程序可以在队列中加入或读取字符,不会相互干扰。
3.2 控制字符
TTY设备还支持控制字符,用于控制终端设备的行为。比如,Ctrl+C对应的控制字符可以中断正在运行的应用程序。Ctrl+D对应的控制字符表示文件结束符,可以用于终止输入。控制字符在终端设备中起到了很重要的作用。
3.3 会话和控制台
在Linux系统中,一个会话是一个或多个进程的集合。每个会话都有一个控制台,用于显示会话中的进程的输入和输出。默认情况下,会话的控制台是TTY设备的物理控制台,也就是显示器和键盘。然而,通过TIOCNOTTY命令,可以将会话的控制台转移到其他TTY设备上。
可以使用tty命令来查看当前会话所使用的TTY设备:
$ tty
/dev/pts/0
上述命令会返回当前会话所使用的TTY设备的文件路径。这对于调试和远程登录非常有用。
4. 总结
Linux TTY设备是Linux系统中重要的字符输入和输出接口。它可以是物理设备,也可以是虚拟设备。通过行规范和终端驱动,TTY设备可以实现字符的输入和输出。其特性包括多路复用、控制字符和会话控制,能够满足各种应用场景的需求。
参考文献
1. Linux TTY Subsystem (https://www.kernel.org/doc/Documentation/tty/tty.txt)
2. Understanding TTYs (http://www.linusakesson.net/programming/tty/)