伪终端(Pseudo-Terminal)是一种类似于终端的特殊的进程间通信通道(channel)。通道的一端被称为主设备(master pseudo-terminal device),另一端被称为从设备。写入主设备的数据被发送到从设备,而写入从设备的数据也可从主设备读出,对用户来说就好像自己实际上连接到了真正的计算机终端之上。简而言之,伪终端是位于虚拟终端和最终的终端设备之间的一种承担着输入输出转换功能的设备。
pty是指虚拟终端。它是这样的一种抽象终端:它所连接的两边设备是抽象的设备,一边是进程抽象的输入设备,而另一边是使用该设备的输出(应用)进程,反之亦然。那么在服务端所说的pty指的是:由客户端的输出,经过传输链路到达服务端,由服务端接收后输入到pty中,这个过程抽象为pty一输入硬件设备。也即是它把客户端当成自身的一个输入。反之,通过同样的过程,将客户端的输入当成pty的输出。那么pty的另一端,也就是对应了服务端的 shell,同样地,pty与shell建立起类似于设备的连接,使得“客户端的输入/输出<==>pty<==>服务端的 shell”建立起了联系,假设pty是透明的,就有类似的“客户端的输入/输出<==>服务端的shell”。通过这种I/O重定向的方式,建立起了telnet的实现基础。
PTY和TTY本来就没有对应关系,根本就是两回事。
那么为什么要有这样的伪终端设备,又为什么要有主设备和从设备配对呢?让我们考虑当一个Linux系统采用X Window一类的图形用户界面(GUI)时的情况。在这样的系统里,整个显示屏以及键盘都在一个视窗管理进程的控制之下,显示屏上有若干个用来模式普通终端的窗口,每个这样的窗口都与一个应用进程(如shell)相联系。但是每个shell进程都以为它的标准输入和标准输出(以及标准出错信息)通道都通向一个终端设备,即不知道也无能力控制显示屏上窗口。怎么办呢?这就要使用伪终端设备了。
每一对伪终端设备连接着显示屏上的一个窗口和一个应用程序。当视窗管理进程从键盘接收到一个字符时,它先要检查当前的"光标"位置,找到当前"活跃"的窗口和与之对应的伪终端"主设备"(作为一个已经打开的文件),然后就把从键盘读入的字符写入到伪终端的"主设备"一端。也就是说,对于键盘输入,视窗管理进程起着中转、搬运的作用,写入伪终端"主设备"一端的字符马上就到达了其"从设备"一端。在那里,对于与"从设备"相关联的进程来说,就跟从普通终端设备读入字符一模一样了。反过来,当“从设备”一边的进程有输出时,它的输出通过伪终端的"从设备"到达"主设备"一端,然后由视窗管理进程读取。视窗管理进程从某个伪终端的"主设备"中接到字符以后,就要根据具体的打开文件号找到显示屏上相应的窗口,换算成显示屏上的位置,再把接收到的字符在这个位置上显示出来。与伪终端"从设备"相关联的进程,根本就不知道它的终端设备到底是一个物理终端,还是实际上只不过是另一个进程。另一方面,伪终端"主设备"一侧的进程也不一定非得把从伪终端“主设备”接收到的内容在显示屏上的某个窗口里显示出来。
/dev/ptyAX -- 伪终端Pseudo Terminal的主设备
/dev/ttyAx -- 伪终端的从设备
/dev/pts/n -- 在Xwindows模式下第n个shell进程所使用的伪终端(伪终端的从设备)
2476

被折叠的 条评论
为什么被折叠?



