先说说什么是终端。
百度百科:终端 Terminal通常是指那些与集中式主机系统相连的“哑”用户设备。
从历史角度看,终端刚开始就是终端机,配有打印机,键盘,带有一个串口,通过串口传送数据到主机端,然后主机处理完交给终端打印出来。
那么现在终端也就是键盘+显示器。但是不同的设备可能协议不同,要操作系统怎么识别呢?简单。就像linux 的虚拟文件系统一样,抽象出一层就可以了。
tty层横空出世,tty的一边是操作系统,一边是不同的设备驱动。大家知道,在linux下所有的设备都是文件,那么假设我们要打印到显示器,只要write到显示器对应的tty层的文件,然后它自己去匹配合适的驱动,这部分就不是系统考虑的问题了。
现在的终端还是实体(也就是有实际的硬件),只不过由tty层做了逻辑抽象。
但是随着互联网的兴起,人们有了远程使用计算机的要求,于是终端仿真系统诞生了。把本地PC当成是一个终端,远程的计算机当成是主机。由软件模拟硬件终端的工作过程(无非就是编码格式,电位等等,设计组成原理等)。比如现在嵌入式开发,不就是把个人PC当作输出输出工具,由开发板做主机么?
现在的个人计算机常常被仿真成一个终端与主机相连(虽然没让我发现有什么优点,也许是为了本地用户和远程用户的同等地位?)
人们用终端仿真技术开发了各种的虚拟终端,伪终端等等。相当于PC不在逻辑上处理数据,只是按照行业标准,进行数据传输(应该有编码过程?)和接受显示(解码?)
此时此刻,终端已经不是狭义的硬件了,它更多的被理解为模拟硬件的软件。
现在说说tty。之前提到了,抽象为了tty层。为什么叫tty呢?
Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,和古老的电报机区别并不是很大。最终,电传打字机被键盘和显示器终端(这里时硬件)所取代,但在终端或TTY接插的地方,操作系统仍然需要一个程序来监视串行窗口。一个getty“Get TTY”的处理过程是:一个程序监视物理的TTY/终端接口。
从上面百度百科的定义,可以知道,后来getty就是一个见识TTY/终端的接口,那么这个将操作系统内核和终端连接的层叫什么名字也就呼之欲出了。
在百度百科里,提到的终端的类型有以下几种:
串行端口终端(/dev/ttySn)
虚拟终端
(/dev/pts/n)
伪终端(/dev/pty/)
控制终端(/dev/tty)
控制台终端(/dev/ttyn,/dev/console) 显示器终端,单用户模式下登陆。
以及其他一些类型
这些具体定义就不赘述了。可以直接度娘。我看度娘的定义有一些矛盾的地方,我总结了下,大概是这个意思
如果使用字符界面或者图形界面就是虚拟终端。
如果是使用图形界面下的命令行,就属于伪终端
用串口RS232直接通信就是终端(实实在在的硬件终端)
tty0前台虚拟终端,tty1-6,字符虚拟终端(类行为linux),tty7图形界面虚拟终端(本人为xterm)。串口RS232是ttySn。
tty有些类似于到实际所使用终端设备的一个联接。
图形界面打开的命令行是pts。
至于pty我没用到过,直接上定义。
大家可是who一下,看看自己现在是什么类型,符合上面的总结不?
pty是成对的逻辑终端设备(即master和slave设备,对master的操作会反映到slave上)。
例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty /m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ptyp3(master设备)看作是一个串行端口设备,则它对该端口的读/ 写操作会反映在该逻辑终端设备对应的另一个ttyp3(slave设备)上面。而ttyp3则是另一个程序用于读写操作的逻辑设备。
以上就是终端和tty。但是只要在终端中执行命令就无法离开shell命令。什么是shell呢?
系统启动时候先启动init,作为一个进程管理器,每个用户登陆的时候,给他一个启动一个虚拟终端程序。
做一个不恰当的类比,可以理解为:输入命令,用终端程序传送给tty层,发送给shell解释程序,shell程序解释执行命令,然后shell把内容返回tty层,返回给终端程序。
我比较懒,呵呵,shell基本工作原理直接引用
http://blog.chinaunix.net/uid-450801-id-2400955.html
写的不错。