linux中tty、pty及pts简介

http://zhangqingli.blog.51cto.com/796670/1312432
在计算机产生之初,由于体型巨大和价格昂贵,不可能像今天的PC机一样一人一台,只能多人共用一台主机。也就是说,所有的使用者,都使用一套自己的IO设备连接到同一台主机上,来操作(使用)计算机。这种情况下,每个使用者所使用的,就是一个“终端”。即一台主机,连接很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源。
随着时代的发展,尤其是PC时代的到来,使每人一台计算机成为现实。在这种情况下,每个人都可以使用此PC专用的键盘和显示器登录到此PC上,而不用和别人分享这台PC的资源。此时,就是“控制台登录”。即,控制台是另一种人机接口,它不通过终端与主机相连,而是通过显示卡-显示器和键盘接口与主机相连。

尽管我们早已进入了PC时代,但是Linux偏要按POSIX标准把个人计算机当成小型机来用,所以Linux在控制台上通过Mingtty软件虚拟了6个终端(编号为tty1-tty6,此数量可以在/etc/inittab里调)和1个图形终端,在虚拟的图形终端中又可以通过Terminal再模拟无限多个模拟终端(pts/0….)。但需要注意的是,当使用这些登录时,全是虚拟的,虽然用起来一样,但实际上并不是真的终端。所以在个人计算机上,只有一个实际的控制台,没有终端,所有终端都是在控制台上用软件模拟的。当然,要把个人计算机当主机再通过串口或网卡外连真正的物理终端也可以,但由于真正的物理终端并不比个人计算机本身便宜,一般没有人这么做。
Linux默认提供的这6个虚拟终端,支持多用户同时登录,包括在本机同时登录。使用组合键“Ctrl+Alt+Fx”能够切换到第x个终端,还可用“Ctrl+Alt+F7”来进入Xwindows的图形界面。(Linux发行版提供7个虚拟屏幕,1~6号是命令行终端,第7个是X- Window,如果要切换到图形界面,前提是已经安装了图形界面)。
虚拟终端tty:tty并不指任何物理意义上的终端,/dev/tty会映射到当前的设备。当我们在这6个虚拟终端中登录时,使用tty命令,可以看出是映射到了/dev/ttyX,此处的X也反映了我们是在几号虚拟终端登录的。
模拟终端pts:当我们在图形界面登录系统,并打开第一个Terminal程序时,运行tty命令,可以看出是映射到了/dev/pts/0。当打开第二个Terminal程序时,在其中运行tty命令,可以看出是我们是在用pts/1和系统进行交互。依次类推。
伪终端pty:伪终端(Pseudo Terminal)是成对的逻辑终端设备,例如/dev/ptyp3和/dev/ttyp3(或着在设备文件系统中分别是/dev/pty/m3和/dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ttyp3看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对的另一个上面(ttyp3)。而ttyp3则是另一个程序用于读写操作的逻辑设备。这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这很像是逻辑设备对之间的管道操作。对于ttyp3(s3),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用ptyp3的程序,则需要专门设计来使用ptyp3(m3)逻辑设备。例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会开始连接到设备ptyp2(m2)上(一个伪终端端口上)。此时一个getty程序就应该运行在对应的ttyp2(s2)端口上。当telnet从远端获取了一个字符时,该字符就会通过m2、s2传递给getty程序,而getty程序就会通过s2、m2和telnet程序往网络上返回”login:”字符串信息。这样,登录程序与telnet程序就通过“伪终端”进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。
控制台终端(console):当我们使用控制台登录系统时,可以理解为控制台终端。此时,使用的是tty1。使用“Ctrl+Alt+[F1—F6]”组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是控制台终端的一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。

ptytty