下一页 上一页 目录

7. 终端特殊文件,例如 /dev/tty

“tty” 是 “Teletype”(电传打字机)的缩写。最早的终端就是电传打字机(类似于远程控制的打字机)。参见 电传打字机 小节。Linux 设备(/dev 目录下的内容)列表可以在 “Linux Allocated Devices” 中找到,该文件应该包含在内核源代码中。它只用一两个词 “描述” 了每个设备的用途,但没有告诉你如何使用它们。

7.1 串口终端

计算机将每个串口都视为一个 “设备”。它有时被称为终端设备,因为在过去,终端是串口最常见的用途。对于每个这样的串口,在 /dev(设备)目录下都有一个特殊文件。/dev/ttyS0 是串口的特殊文件,在 DOS/Windows 世界中被称为 COM1。

要将文本发送到终端,你可以将某些命令行命令的标准输出重定向到相应的特殊文件。例如,在命令提示符下键入 “echo test > /dev/ttyS1” 应该会将单词 “test” 发送到 ttyS1 (COM2) 上的终端,前提是你对 /dev/ttyS1 具有写入权限。类似地,键入 “cat my_file > /dev/ttyS0” 会将文件 my_file 的内容发送到 COM1 (ttyS0)。

7.2 伪终端

伪终端是成对的设备,例如 /dev/ptyp3 和 /dev/ttyp3。没有物理设备直接与它们中的任何一个关联,甚至没有串口连接器。但是,如果一个程序像对待串口一样对待 ttyp3,那么写入该端口和从该端口读取的内容会出现在该对的另一个成员 ptyp3 上,另一个程序使用 ptyp3 来读取和写入。因此,两个程序通过这种方法相互通信,并且 ttyp3 上的一个程序认为它正在与串口通信。这有点像这两个 tty 之间的 “管道”。

对于与 ttyp3 通信,任何设计为与串口通信的程序都可以。但是对于另一个与 ptyp3 通信的程序,它必须是专门编写的才能与它通信。主要是程序员需要关注伪终端,大多数用户不需要担心它们。

这里有一个例子:如果有人通过网络使用 telnet 连接到你的计算机(你是 telnet 服务器),则 telnet 程序在你计算机上处理此连接的部分可能会连接到伪终端 ptyp2。getty 程序应该在相应的 ttyp2 上运行。Getty 认为它正在与终端通信。当 telnet 从远程客户端获取字符时,它会通过 ptyp2 到 ttyp2 到 getty,然后 getty 发回 “login:”,并通过 ttyp2、ptyp2、你的服务器 telnet 程序,然后通过网络返回到客户端。在这里,login 程序和 telnet 服务器程序通过 “伪终端” 相互通信。请注意,客户端计算机上没有使用伪终端,只有 telnet。当然,服务器为每个客户端分配一个伪终端(在服务器上)。

在 X Window 中,终端模拟器程序(例如 xterm)使用伪终端。Linux 下的业余无线电程序也使用它们。通过使用某些应用程序软件,可以使 2 个或更多伪终端连接到同一个物理串口。

对于伪终端对,例如 ptyp3 和 ttyp3,pty... 是主终端或控制终端,而 tty... 是从终端。

只有 16 个 ttyp:ttyp0-ttypf(f 是十六进制数字)。为了获得更多对,使用了更多的字母,例如 q、r、s 而不是 p。例如,ttys8、ptys8 对是一个伪终端对。稍后,添加了更多的字母,以便允许更多的伪终端。当达到 z 时,它们会绕回到 a。这很令人困惑,但旧习惯很难改变。今天,Linux 允许例如 ttyp189,但它没有被使用。设备文件系统(于 2004 年被放弃)将使用 tty/s189。请务必不要键入例如 ttys2,如果你指的是 ttyS2(真正的串口)。

主终端和从终端实际上是同一个 “端口”,但是从终端由应用程序使用,而主终端由网络程序(或类似程序)使用,该程序向从端口提供(和获取)数据。使用从端口的程序可以 “按原样” 运行,因为它认为它正在与串口通信。

Unix98 伪终端(在 Linux 上可用)比上述更高级,但基本概念是相同的(只是设备名称和创建它们的方法发生了变化)。它根据请求创建伪终端设备,因此无需检查你可能想要使用的伪终端是否正在使用。通过打开 /dev/ptmx,会创建一个新的伪终端对。主终端不会显示为设备,而只是传递给打开 /dev/ptmx 的计算机程序的文件描述符编号。但是从终端被放入 /dev/pts 目录中:例如 “/dev/pts/3”。

/dev/pts 目录被认为是 devpts 类型的 文件系统,并出现在已挂载文件系统的列表中。虽然 “文件” /dev/pts/3 看起来像是现在已过时的设备文件系统中的条目,但 /dev/pts 实际上是一种完全不同的文件系统。

有关更多详细信息,请参阅 Linux 手册页 “pty” 和 “pts”(Unix 98 风格)。对于程序员,有手册页 openpty/forkpty(任一名称都显示相同的手册页),它假设你已经了解伪终端。有一个 usr/include/pty.h 文件供程序员使用。在早期版本的 Linux 中,有一个 pty.o 模块,但现在似乎已将其内置到内核中。以下是在编译 Linux 2.6 内核时可用的一些选项示例

 CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256 

7.3 控制终端 /dev/tty

/dev/tty 代表当前进程的控制终端(如果有)。要查找哪些 tty 连接到哪些进程,请在 shell 提示符(命令行)下使用 “ps -a” 命令。查看 “tty” 列。对于你所在的 shell 进程,/dev/tty 是你现在正在使用的终端。在 shell 提示符下键入 “tty” 以查看它是什么(参见手册页 tty(1))。/dev/tty 有点像指向实际终端设备名称的链接,并为 C 程序员提供了一些附加功能:请参阅手册页 tty(4)。

7.4 /dev/ttyIN “终端”

N 代表整数。这些在 Linux 中的一种用途是与 ISDN 驱动程序包:isdn4linux 一起使用。ttyIN 有点像 ttySN,但它模拟调制解调器,并且可以给出调制解调器命令。

7.5 控制台:ttyN 或 vc/N

在 Linux 中,PC 监视器通常称为控制台,并且有几个与其关联的设备特殊文件:vc/0 (tty0)、vc/1 (tty1)、vc/2 (tty2) 等。当你登录时,你位于 vc/1 上。要转到 vc/2(在同一屏幕上),请按下 2 个键 Alt(左)-F2。对于 vc/3,请使用 Left Alt-F3,等等。这些(vc/1、vc/2、vc/3 等)被称为 “虚拟终端”。vc/0 (tty0) 只是当前虚拟终端的别名,系统消息会发送到这里。因此,来自系统的消息将显示在控制台(监视器)上,无论它显示哪个虚拟终端。

你可以登录到不同的虚拟终端,从而同时与计算机进行几个不同的会话。只有系统或 root 用户可以写入 /dev/vc/0,/dev/console 有时会链接到它。有关控制台的更多信息,请参阅 Linux 控制台

7.6 使用 “mknod” 创建设备

/dev 目录附带了许多设备特殊文件。如果你需要那里没有的东西,你可以尝试使用 “mknod” 命令创建它。有关如何为串口执行此操作,请参阅手册页 ttys(4)。要使用 mknod,你必须知道主设备号和次设备号。你可能可以通过在 /dev 目录中使用 “ls -l” 命令来推断你需要的数字。它将显示现有特殊文件的主设备号和次设备号。


下一页 上一页 目录