转自http://blog.sina.com.cn/s/blog_638ac15c01012e0v.html
基本概念:1> tty(终端设备的统称):
tty一词源于Teletypes,或teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘和显示器取代,所以现在叫终端比较合适。
终端是一种字符型设备,他有多种类型,通常使用tty来简称各种类型的终端设备。
2> pty(虚拟终端):
但是假如我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty)
3> pts/ptmx(pts/ptmx结合使用,进而实现pty):
pts(pseudo-terminal slave)是pty的实现方法,和ptmx(pseudo-terminal master)配合使用实现pty。
Linux终端:
在Linux系统的设备特别文档目录/dev/下, 终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备 终端特别设备文档一般有以下几种:
1、串行端口终端(/dev/ttySn)
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。
这些串行端口所对应的设备名称是/dev/ttyS0、/dev/ttyS1等,分别对应于DOS系统下的COM1、COM2等。
- [root@Kendo ~]# ls -l /dev/ttyS*
- crw-rw---- 1 root uucp 4, 64 Jan 8 13:39 /dev/ttyS0
- crw-rw---- 1 root uucp 4, 65 Jan 8 13:39 /dev/ttyS1
- crw-rw---- 1 root uucp 4, 66 Jan 8 13:39 /dev/ttyS2
- crw-rw---- 1 root uucp 4, 67 Jan 8 13:39 /dev/ttyS3
2、伪终端(/dev/pty/) 参考http://blog.csdn.net/qingkongyeyue/article/details/74128881 伪终端(Pseudo Terminal)是成对的逻辑终端设备,例如/dev/ptyp3和/dev/ttyp3(或着在设备文件系统中分别是/dev/pty/m3和/dev/pty/s3)。它们与实际的物理终端设备并不直接相关。pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。(这些都是非x windows的模式,即命令行模式。)
Note: Xterm 是在Xwindow模式下的虚拟终端(或者叫终端仿真器,是一个软件)。-(备注,这是我自己的理解,未知对否?) 从终端登录简述
Linux系统引导的时候,会运行init进程,它会执行/etc/inittab(这跟具体的init类型有关,我使用了busybox的init,但其本质是一样的):
- [root@SkyNet ~]# cat /etc/inittab
-
::sysinit:/etc/init.d/rcS
- ::respawn:/sbin/getty 9600 ttyS0
当用户键入用户名后,getty就执行login程序,类似于:execle("login")。login可以调用getpass()以显示 Password:并读入用户口令。并且调用getpwnam进行口令验证。如果成功,调用类似execle("shell")。这样,登录用户就拥有了 一个shell了。
伪终端
上述登录过程,对于网络用户来说,却不能完全实用。很显然,网络用户并不需要一个串口,也不需要一个显示器,他需要的是在他的本地显示设备上,
运行Linux的shell。以telnetd为例,它至少应该是这样子的:
图一:telnet登录假想图
这里,这个“某个终设备”,自然不可能是一个实际的物理终端设备,因为压根没有这样的设备。这样,伪终端的概念就被引入进来了。伪终端设备是一种特殊的逻辑终端驱动设备, 它并不驱动某个实际物理设备,而是用来将终端的输出定向到应用程序中进行处理。伪终端设备之所以存在是为了提供在程序控制下的一种模拟串行终端行为的方法。
伪终端与前面说的终端在表现形式上,最大的不同,就是它总是成对出现,而不是单一的一个。它分为“伪终端主设备(/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 个
任何写入到伪终端主设备的输入,都会作为伪终端从设备的输入,反之亦然。类似于管道,如下图:
一个典型的伪终端进程结构如下图:
这张图的关键在于:如果把伪终端从设备想像为传统的终端设备,把主设备看成进程读写数据的一个“接口”,那么它的工作原理,就跟传统终端一样了。
上述只是一个本地进程,把网络引入进来,对应到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下的应用而言,知道伪终端的数量是一个关键的东西,或者它直接决定了最大支持用户数,例如PPTP VPN的应用。(没有多余的可以供打开的伪终端设备了)。
对于2.6.X而言,在
- Device Drivers --->
- Character devices --->
- [*] Legacy (BSD) PTY support
- (256) Maximum number of legacy PTY in use
- #ls -l /dev/ptyp*
- crw-r--r-- 1 root root 2, 0 Dec 18 05:36 /dev/ptyp0
- crw-r--r-- 1 root root 2, 1 Dec 18 05:36 /dev/ptyp1
- crw-r--r-- 1 root root 2, 2 Dec 18 05:36 /dev/ptyp2
- crw-r--r-- 1 root root 2, 3 Dec 18 05:36 /dev/ptyp3
- crw------- 1 root root 3, 0 Dec 18 05:36 /dev/ttyp0
- crw------- 1 root root 3, 1 Dec 18 05:36 /dev/ttyp1
- crw-r--r-- 1 root root 3, 2 Dec 18 05:36 /dev/ttyp2
- crw------- 1 root root 3, 3 Dec 18 05:36 /dev/ttyp3
为了解决这个问题,Linux引入了一种新的命名方式:UNIX98_PTYS。关于这个东西,内核是这样解释的:
- Linux has traditionally used the BSD-like names /dev/ptyxx for
- masters and /dev/ttyxx for slaves of pseudo terminals. This scheme
- has a number of problems. The GNU C library glibc 2.1 and later,
- however, supports the Unix98 naming standard: in order to acquire a
- pseudo terminal, a process opens /dev/ptmx; the number of the pseudo
- terminal is then made available to the process and the pseudo
- terminal slave can be accessed as /dev/pts/<number>. What was
- traditionally /dev/ttyp2 will then be /dev/pts/2, for example.
- All modern Linux systems use the Unix98 ptys. Say Y unless
- you're on an embedded system and want to conserve memory.
- # ls -l /dev/pts/
- crw------- 1 root root 136, 0 Jan 8 12:18 0
- crw------- 1 root root 136, 1 Jan 8 08:08 1
- crw------- 1 root root 136, 2 Jan 8 14:10 2
- crw------- 1 root root 136, 3 Jan 8 14:27 3
- crw------- 1 root root 136, 4 Jan 8 08:29 4
3、控制终端(/dev/tty)
如果当前进程有控制终端(Controlling
Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特别文档。能够使用命令”ps
ax”来查看进程和哪个控制终端相连。对于您登录的shell,/dev/tty就是您使用的终端,设备号是(5,0)。使用命令”tty”能够查看他
具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。 控制终端并不面对设备,而是面对进程
4、控制台终端(/dev/ttyn, /dev/console)
在Linux系统中,电脑显示器通常被称为控制台终端
(Console)。他仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特别文档和之相关联:tty0、tty1、tty2
等。当您在控制台上登录时,使用的是tty1。使用Alt+[F1―F6]组合键时,我们就能够转换到tty2、tty3等上面去。tty1tty6等
称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上(这时也叫控制台终端)。因此不管当前正在使用哪个虚拟终
端,系统信息都会发送到控制台终端上。您能够登录到不同的虚拟终端上去,因而能够让系统同时有几个不同的会话期存在。只有系统或终极用户root能够向
/dev/tty0进行写操作 即下例:
1、# tty(查看当前TTY)
/dev/tty1
2、#echo "test tty0" > /dev/tty0
test tty0
5 虚拟终端(/dev/pts/n)
在Xwindows模式下的伪终端.
6 其他类型
Linux系统中还针对很多不同的字符设备存在有很多其他种类的终端设备特别文档。例如针对ISDN设备的/dev/ttyIn终端设备等。这里不再赘述。 ################################## ################################## ################################## ######################################################################################################FAQ: 终端和控制台
Q:/dev/console 是什么?
A:/dev/console即控制台,是和操作系统交互的设备,系统将一些信息直接输出到控制台上。现在只有在单用户模式下,才允许用户登录控制台。
Q:/dev/tty是什么?
A:tty设备包括虚拟控制台,串口连同伪终端设备。
/dev/tty代表当前tty设备,在当前的终端中输入 echo “hello” > /dev/tty ,都会直接显示在当前的终端中。
Q:/dev/ttyS*是什么?
A:/dev/ttyS*是串行终端设备。
Q:/dev/pty*是什么?
A:/dev/pty*即伪终端,所谓伪终端是逻辑上的终端设备,多用于模拟终端程式。例如,我们在X Window下打开的终端,连同我们在Windows使用telnet 或ssh等方式登录Linux主机,此时均在使用pty设备(准确的说在使用pty从设备)。
Q:/dev/tty0和/dev/tty1 …/dev/tty63是什么?他们之间有什么区分?
A:/dev/tty0代表当前虚拟控制台,而/dev/tty1等代表第一个虚拟控制台,例如当使用ALT+F2进行转换时,系统的虚拟控制台为/dev/tty2 ,当前的控制台则指向/dev/tty2
Q:怎样确定当前所在的终端(或控制台)?
A:使用tty命令能够确定当前的终端或控制台。
Q:/dev/console是到/dev/tty0的符号链接吗?
A:
现在的大多数文本中都称/dev/console是到/dev/tty0的链接(包括《Linux内核源代码情景分析》),但是这样说是不确切的。根据内
核文档,在2.1.71之前,/dev/console根据不同系统的设定能够链接到/dev/tty0或其他tty*上,在2.1.71版本之后则完
全由内核控制。现在,只有在单用户模式下能够登录/dev/console(能够在单用户模式下输入tty命令进行确认)。
Q:/dev/tty0和/dev/fb*有什么区分?
A: 在Framebuffer设备没有启用的系统中,能够使用/dev/tty0访问显卡。
Q:关于终端和控制台的区分能够参考哪些文本
A:
能够参考内核文档中的 Documents/devices.txt 中关于”TERMINAL DEVICES”
的章节。另外,《Linux内核源代码情景分析》的8.7节 连同《Operating Systems : Design and
Implementation》中的3.9节(第3版中为3.8节)都对终端设备的概念和历史做了很好的介绍。另外在《Modern
Operating system》中也有对终端设备的介绍,由于和《Operating Systems : Design and
Implementation》的作者相同,所以文本内容也大致相同。需要注意的一点是《Operating Systems : Design
and Implementation》中将终端设备分为3类,而《Modern Operating
system》将终端硬件设备分为2类,差别在于前者将 X Terminal作为一个类别。
PS:
只有2410的2.6才叫ttySAC0,9200等的还是叫ttyS0