Linux命令学习手册-tty

tty [选项]...

功能

打印连接到标准输入的终端的文件名。

描述

命令项:

  • -s, –silent, –quiet: 什么也不打印,只是返回退出状态码。
  • –help: 打印帮助信息。
  • –version: 打印版本信息并退出。

返回的状态码:

  • 0 表示标准输入是一个终端。
  • 1 表示标准输入不是一个终端。
  • 2 表示给定的参数是不正确的参数。
  • 3 表示发生了写错误。

举例

查看当前的标准终端文件描述符号

[quietheart@lv-k etc]$ tty 
/dev/pts/6

这里,输入 tty 之后,输出 /dev/pts/6 就是当前连接的终端对应的文件描述符号,我们可以通过向这个文件,这样会看到当前终端会输出我们写入的数据,例如:

[quietheart@lv-k etc]$ echo "mytest" >/dev/pts/6 
mytest

可见,向 /dev/pts/6 文件写入的内容,直接显示到我们的终端上面了。如果我在机器上面开了多个终端,然后我在别的终端中输入上面的 echo 命令,那么将会看到对应 /dev/pts/6 的终端上面会显示相应的字符了。

运行 tty 什么也不输出,然后查看其退出码

[quietheart@lv-k etc]$ tty -s 
[quietheart@lv-k etc]$ echo $? 
0

这里,使用 shell 的命令 echo $? 来显示上一条命令的退出状态码。

状态码的含义如下:

  • 0 表示标准输入是一个终端。
  • 1 表示标准输入不是一个终端。
  • 2 表示给定的参数是不正确的参数。
  • 3 表示发生了写错误。

其它

基本概念

  • tty (终端设备的统称): tty 一词源于 Teletypes ,或者 teletypewriters ,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。终端是一种字符型设备,它有多种类型,通常使用 tty 来简称各种类型的终端设备。
  • pty (虚拟终端): 如果我们远程 telnet 到主机或使用 xterm 时,也需要一个终端交互,这就是虚拟终端 pty ( pseudo-tty ) 。
  • pts/ptmx ( pts/ptmx 结合使用,进而实现 pty ): pts (pseudo-terminal slave)是 pty 的实现方法,与 ptmx (pseudo-terminal master)配合使用实现 pty

Linux终端

在Linux系统的设备特殊文件目录 /dev/ 下,终端特殊设备文件一般有以下几种:

串行端口终端( /dev/ttySn )

串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是 /dev/tts/0 (或 /dev/ttyS0 ), /dev/tts/1 (或 /dev/ttyS1 )等,设备号分别是 (4,0), (4,1) 等,分别对应于DOS系统下的 COM1COM2 等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入: echo test > /dev/ttyS1 会把单词 test 发送到连接在 ttyS1 ( COM2 )端口的设备上。可接串口来实验。

伪终端( /dev/pty/ )

伪终端(Pseudo Terminal)是成对的逻辑终端设备(即 masterslave 设备, 对 master 的操作会反映到 slave 上)。

例如 /dev/ptyp3/dev/ttyp3 对儿,(或者在设备文件系统中分别是 /dev/pty/m3/dev/pty/s3 )。它们与实际物理设备并不直接相关。如果一个程序把 ptyp3 ( master 设备)看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对应的另一个 ttyp3 ( slave 设备)上面。而 ttyp3 则是另一个程序用于读写操作的逻辑设备。

这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用 ttyp3 的程序则认为自己正在与一个串行端口进行通信,这很象是逻辑设备对之间的管道操作。这里,比较关键需要注意的是:对于 ttyp3 ( s3 ),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备;但对于使用 ptyp3 的程序,则需要专门设计来使用 ptyp3 ( m3 )逻辑设备。

例如,如果某人在网上使用 telnet 程序连接到你的计算机上,则 telnet 程序就可能会开始连接到设备 ptyp2 ( m2 )上(一个伪终端端口上)。此时一个 getty 程序就应该运行在对应的 ttyp2 ( s2 )端口上。当 telnet 从远端获取了一个字符时,该字符就会通过 m2s2 传递给 getty 程序,而 getty 程序就会通过 s2m2telnet 程序往网络上返回” login: ”字符串信息。这样,登录程序与 telnet 程序就通过“伪终端”进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。

在使用设备文件系统 (device filesystem)之前,为了得到大量的伪终端设备特殊文件,使用了比较复杂的文件名命名方式。因为只存在16个 ttyp ( ttyp0ttypf ) 的设备文件,为了得到更多的逻辑设备对,就使用了象 qrs 等字符来代替 p 。例如, ttys8ptys8 就是一个伪终端设备对。不过这种命名方式目前仍然在RedHat等Linux系统中使用着。

但Linux系统上的Unix98并不使用上述方法,而使用了 pty master 方式,例如 /dev/ptm3 。它的对应端则会被自动地创建成 /dev/pts/3 。这样就可以在需要时提供一个 pty 伪终端。目录 /dev/pts 是一个类型为 devpts 的文件系统,并且可以在被加载文件系统列表中看到。虽然“文件” /dev/pts/3 看上去是设备文件系统中的一项,但其实它完全是一种不同的文件系统。

即: TELNET ---> TTYP3(S3: slave) ---> PTYP3(M3: master) ---> GETTY

终端总结

对上述提到的Linux终端、串行终端、虚拟终端、伪终端概念进行总结如下:

  • 终端:输入和输出设备(键盘+显示器)
  • 虚拟终端:一台PC只有一套键盘和显示器,也就只有一套终端设备,但是可以通过 Ctrl+Alt+F1~Ctrl+Alt+F6 切换到字符终端,相当于有6套虚拟的终端设备,他们共用一套物理终端设备/dev/tty1~/dev/tty6
  • 串行终端:与机器的串口对应,每一个串口对应的一个串行终端,串口对应的是物理终端
  • 伪终端:虚拟终端和串行终端的数目是有限的,但是,网络端口和图形端窗口的数目确不受限制,这是因为它们是通过伪终端实现的。
  • 控制终端:这是一个逻辑概念,即用户正在控制的终端,可以使串行终端,虚拟终端和伪终端
  • 控制台终端:控制台终端可以认为是一个PC对应的一套键盘和显示器,所有虚拟终端是对应的都是同一控制台终端。

实践

以下过程是在ubuntu上面的实践结果。

1、虚拟终端 /dev/tty* 和伪终端 /dev/pts/*

假设5个 xterm 终端的话,会发现 /dev 下面有一个 /dev/ptmx / 和5个 /dev/pts/*

而如果用"[Ctrl][Alt]F1"进入一个终端的话,就会发现 /dev 下面多出一个 /dev/tty1

2、查看终端的方法

使用命令 tty 可以查看当前对应的终端,命令 ps -ax 可以查看所有程序以及对应的终端。通过这个命令,发现如果多开一个 screen 程序,或者用 telnet 登陆之后,那么机器上面就会多一个 /dev/pts/* 。可知,一般伪终端用户模拟终端程序。

3、向指定终端发送信息

如果运行 echo hello >/dev/tty2 , 那么 [Ctrl][Alt]F2 打开 /dev/tty2 对应的终端,就会发现刚才发送的 hello 了。

注意,如果发送 echo -n ls >/dev/tty2 那么会显示 ls ,但是回车之后,并没有执行 ls 。可见: ttyN 是代表linux的纯命令行终端,而写到这个终端的字符串只是做为这个终端的输出,并没有当做终端的输入处理。

如果运行 echo hello >/dev/pts/2 , 那么,就可以在 xterm 的第二个窗口看到 hello 了。可知, /dev/pts/n 是Xwindows模式下的伪终端.

参考资料

  • http://blog.csdn.net/freeman1975/archive/2009/10/19/4696781.aspx
  • https://blog.csdn.net/LV_YONG/article/details/80632148
  • info tty
  • man tty

你可能感兴趣的:(Linux命令学习手册-tty)