Linux下终端之谈

Linux下终端类型详解

终端简介:

终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念。一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源.。

终端有字符哑终端和图形终端两种.

个人计算机上只有控制台,没有终端.linux按POSIX标准把个人计算机当成小型机来用,就在控制台上通过getty软件虚拟了六个字符哑终端(或者叫控制台终端tty1-tty6)和一个图型终端。在虚拟图形终端中又可以通过软件(如rxvt)再虚拟无限多个虚拟字符哑终端(pts/0....)。记住,这全是虚拟的,用起来一样,但实际上并不是。所以在个人计算机上,只有一个实际的控制台,没有终端,所有终端都是在控制台上用软件模拟的。

终端类型:

tty控制终端(终端设备的统称)

 

控制台终端:

console: 控制台终端

    tty#: 控制台终端下的虚拟终端

  

非控制台终端:

    ttyS#: 串行端口终端

    pty/#: 伪终端(终端模拟软件)

    pts#: 图形终端 X-windows下的伪终端

 

简单的说,能直接显示系统消息的那个终端称为控制台,其他的则称为终端。但是在linux系统中,这个概念也已经模糊化了。具体区别,请自行百度,余不一一。

 

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

也被称为终端设备,用来连接终端;计算机把每个串行端口都看作是一个字符设备。设备号分别是(4,0)、(4,1)等,分别对应于DOS系统下的COM1、COM2等。

若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:

echo test > /dev/ttyS1

 

控制终端(/dev/tty

如果当前进程有控制终端的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件(似懂非懂)。它并不指任何物理意义上的终端,/dev/tty会映射到当前的设备,你如果在ttyN控制台界面下,那么dev/tty会映射到dev/tty1-6之间当前使用的ttyN界面下,如果你是在图形界面(Xwindows),那么/dev/tty映射到图形界面下打开的终端即/dev/pts之类的伪终端上。

因此,可以说,对于你登录的shell,/dev/tty就是你当前所在的终端,设备号是(5,0)。/dev/tty有些类似于到实际所使用终端设备的一个联接。

可以使用命令"ps –ax"来查看进程与哪个控制终端相连。使用命令"tty"可以查看它 具体对应哪个实际终端设备,即tty当前映射到的终端


它并不面对设备,而是面对进程。


控制台终端(/dev/ttyn,/dev/console )

在Linux系统中,计算机显示器通常被称为控制台终端(Console).它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。当你在控制台上登录时,使用的是tty1。

 

tty1 –tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。只有系统或超级用户root可以向/dev/tty0进行写操作.

console是一个缓冲的概念,其实是为内核提供打印的。我们的pc,终端常用的是显示器和键盘构成,我们用户打印和内核打印都从这个终端反映给用户。所以, /dev/console是连接到/dev/tty0的,其实这里有2个概念,console和tty这2个咚咚,怎么实现,脑补了一下实现的机制应该是这样的:

 

其实console这个结构中有个device,这里其实就是tty0对应的一个虚拟终端设备。如果,我们来个专门打印内核的设备(比如通过串口),我们把那个串口register_console,那么/dev/console就到这个串口设备了。这时,内核打印就到这个串口设备了,而用户的打印还是和上面的/dev/tty相关,如果/dev/tty对应/dev/tty0,那么用户打印还在窗口中出现。所以说/dev/console是用来外接控制台的。

 

虚拟终端(/dev/pts)

在Xwindows模式下的伪终端。另有人解释:每一个远程连接都会产生一个pts设备。

 

伪终端(/dev/pty/)

伪终端(PseudoTerminal)是成对的逻辑终端设备,包括(/dev/ptyMN)[伪终端主设备]和(/dev/ttyMN)[伪终端从设备],其中,M与N的命名方式如下:

 

    M: p q r s t u v w x y z a b c d e共16

    N: 0 1 2 3 4 5 6 7 8 9 a b c d e f共16

 

 

默认支持最大是256个。

或着:在设备文件系统中分别是/dev/pty/m3和 /dev/pty/s3。

 

它们与实际物理设备并不直接相关。如果一个程序把ptyp3看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对的另一个上面(ttyp3)。而ttyp3则是另一个程序用于读写操作的逻辑设备。这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这很象是逻辑设备对之间的管道操作。对于ttyp3(s3),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用ptyp3的程序,则需要专门设计来使用ptyp3 (m3)逻辑设备。

 

任何写入到伪终端主设备的输入,都会作为伪终端从设备的输入,反之亦然。类似于管道,如下图:


 

一个典型的伪终端进程结构如下图:

 

这张图的关键在于:如果把伪终端从设备想像为传统的终端设备,把主设备看成进程读写数据的一个“接口”,那么它的工作原理,就跟传统终端一样了。

 

上述只是一个本地进程,把网络引入进来,对应到telnetd上面来,应该是下面这个样子:

 

 

同样的登录方式,就变成了这样:

1、如果某人在网上使用telnet程序连接到本地服务器,则telnetd程序就可能会开始连接到设备ptyp2(m2)上(一个伪终端主设备上)。

2、telnetd产生一个子进程,进行getty程序,其打开一个对应的从设备对应的ttyp2(s2),并设置stdin\stdout\stderr;

3、telnetd通过内核tcp/ip协议栈从远端获取了一个字符时,该字符就会通过m2、s2传递给getty程序,而getty程序就会通过s2、m2和telnetd程序往网络上返回”login:”字符串信息;

4、这样,登录程序与telnetd程序就通过“伪终端”进行通信;

 

本文参考文章:

linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章