伪终端

伪终端(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本来就没有对应关系,根本就是两回事。


上面讲到的这些终端设备都是物理上存在的,即使是"虚拟终端",最终也要对应到一个物理的终端上。就拿显示器和键盘的组合来说,虽然与传统的终端设备有所不同,但毕竟具备了构成一个终端的物理要素。然而,随着计算机技术的发展,出现了对一种特殊"终端设备"的需要,这个设备在逻辑上是终端设备,可是实际上却不是,所以称为"伪终端"(pseudo tty)。伪终端总是成对地使用的,就好像是个管道的两端。一端的设备称为"主设备"(master),其主设备号为2,设备名为/dev/ptyAX(/dev/ptys0),这里的A表示16个字母"pqrstuvwxyQPRST"中的一个,X则为16个16进制数字(0~f)之一,这样一共可以256个伪终端主设备。另一端的设备称为"从设备"(slave),其主设备号为3,设备名则为/dev/ttyAX(/dev/ttys0),同样也是256个。每一对伪终端设备,例如/dev/ptys0和/dev/ttys0,就好像是通过一个管道连在一起,其"从设备"一端与普通的终端设备没有什么区别,而"主设备"一端则跟管道文件相似。

    那么为什么要有这样的伪终端设备,又为什么要有主设备和从设备配对呢?让我们考虑当一个Linux系统采用X Window一类的图形用户界面(GUI)时的情况。在这样的系统里,整个显示屏以及键盘都在一个视窗管理进程的控制之下,显示屏上有若干个用来模式普通终端的窗口,每个这样的窗口都与一个应用进程(如shell)相联系。但是每个shell进程都以为它的标准输入和标准输出(以及标准出错信息)通道都通向一个终端设备,即不知道也无能力控制显示屏上窗口。怎么办呢?这就要使用伪终端设备了。

    每一对伪终端设备连接着显示屏上的一个窗口和一个应用程序。当视窗管理进程从键盘接收到一个字符时,它先要检查当前的"光标"位置,找到当前"活跃"的窗口和与之对应的伪终端"主设备"(作为一个已经打开的文件),然后就把从键盘读入的字符写入到伪终端的"主设备"一端。也就是说,对于键盘输入,视窗管理进程起着中转、搬运的作用,写入伪终端"主设备"一端的字符马上就到达了其"从设备"一端。在那里,对于与"从设备"相关联的进程来说,就跟从普通终端设备读入字符一模一样了。反过来,当“从设备”一边的进程有输出时,它的输出通过伪终端的"从设备"到达"主设备"一端,然后由视窗管理进程读取。视窗管理进程从某个伪终端的"主设备"中接到字符以后,就要根据具体的打开文件号找到显示屏上相应的窗口,换算成显示屏上的位置,再把接收到的字符在这个位置上显示出来。与伪终端"从设备"相关联的进程,根本就不知道它的终端设备到底是一个物理终端,还是实际上只不过是另一个进程。另一方面,伪终端"主设备"一侧的进程也不一定非得把从伪终端“主设备”接收到的内容在显示屏上的某个窗口里显示出来。




/dev/ptyAX    -- 伪终端Pseudo Terminal的主设备
/dev/ttyAx    -- 伪终端的从设备
/dev/pts/n    -- 在Xwindows模式下第n个shell进程所使用的伪终端(伪终端的从设备)

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值