码迷,mamicode.com
首页 > 系统相关 > 详细

Linux35_TTY和伪终端

时间:2021-04-13 11:50:18      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:这一   sid   数据流   规范   line   cli   kde   部分   实现   

==================【伪终端】==========================

tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。

伪终端(pseudo terminal,有时也被称为 pty),pty(虚拟终端)
指伪终端 master 和伪终端 slave 这一对字符设备。
其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 master 则在内存中标识为一个文件描述符(fd)。
伪终端由终端模拟器提供,终端模拟器是一个运行在用户态的应用程序。

Master 端是更接近用户显示器、键盘的一端,slave 端是在虚拟终端上运行的 CLI(Command Line Interface,命令行接口)程序。
Linux 的伪终端驱动程序,会把 master 端(如键盘)写入的数据转发给 slave 端供程序输入,把程序写入 slave 端的数据转发给 master 端供(显示器驱动等)读取。

我们打开的终端桌面程序,比如 GNOME Terminal,其实是一种终端模拟软件。
/dev/ptmx文件(the pseudoterminal multiplexor device)是一个字符文件。通常权限为0x666,拥有者是root用户。被用于创建一个伪终端master和slave对;
当终端模拟软件运行时,它通过打开 /dev/ptmx 文件创建了一个伪终端的 master 和 slave 对,并让 shell 运行在 slave 端。
当用户在终端模拟软件中按下键盘按键时,它产生字节流并写入 master 中,shell 进程便可从 slave 中读取输入;
shell 和它的子程序,将输出内容写入 slave 中,由终端模拟软件负责将字符打印到窗口中。

 

Linux 中为什么要提出伪终端这个概念呢?shell 等命令行程序不可以直接从显示器和键盘读取数据吗?
为了同屏运行多个终端模拟器、并实现远程登录,还真不能让 shell 直接跨过伪终端这一层。
在操作系统的一大思想——虚拟化的指导下,为多个终端模拟器、远程用户分配多个虚拟的终端是有必要的。
shell 使用的 slave 端就是一个虚拟化的终端。Master 端是模拟用户一端的交互。
之所以称为虚拟化的终端,是因为它除了转发数据流外,还要有点终端的样子。
伪终端的作用就是转发数据流;

 

伪终端本质上是运行在用户态的终端模拟器创建的一对字符设备。
其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 master 则在内存中标识为一个文件描述符(fd)。
对于伪终端来说,重点是软件仿真终端程序运行在用户空间,这是它与终端的本质区别。

写入slave的数据,被作为master文件的输入,之后由master展示在屏幕上;
同理,写入master文件的数据,被作为slave文件的输入,之后slave发送给真实终端;

=================【TTY】==========================
https://www.cnblogs.com/sparkdev/p/11460821.html

 

TTY 是 Teletype 或 Teletypewriter 的缩写,原来是指电传打字机,后来这种设备逐渐键盘和显示器取代。
不管是电传打字机还是键盘显示器,都是作为计算机的终端设备存在的,
所以 TTY 也泛指计算机的终端(terminal)设备。


为了支持这些 TTY 设备,Linux 实现了一个叫做 TTY 的子系统
所以 TTY 既指终端,也指 Linux 的 TTY 子系统,当然 TTY 还有更丰富(混乱)的含义。

早期的终端(terminal) 是一台独立于计算机的机器(teletype 即, TTY)
它终端通过线缆与计算机连接,并完成计算机的输入输出功能
现在物理终端实际上已经灭绝了,我们看到的所有 TTY 都是模拟视频终端,即软件仿真出来的终端。

 

提到终端就不能不提控制台 console。控制台的概念与终端含义非常相近,其实现在我们经常用它们表示相同的东西,但是在计算机的早期时代,它们确实是不同的东西。
在计算机里,把那套直接连接在电脑上的键盘和显示器就叫做控制台。
而终端是通过串口连接上的,不是计算机自身的设备,而控制台是计算机本身就有的设备,一个计算机只有一个控制台。
计算机启动的时候,所有的信息都会显示到控制台上,而不会显示到终端上。这同样说明,控制台是计算机的基本设备,而终端是附加设备。

现在终端和控制台都由硬件概念,逐渐演化成了软件的概念。简单的说,能直接显示系统消息的那个终端称为控制台,
其他的则称为终端(控制台也是一个终端)。或者我们在平时的使用中压根就不区分 Linux 中的终端与控制台。


从历史上看,终端刚开始就是终端机,配有打印机,键盘,带有一个串口,通过串口传送数据到主机端,然后主机处理完交给终端打印出来。
电传打字机(teletype)可以被看作是这类设备的统称,因此终端也被简称为 TTY(teletype 的缩写)

 

UART 驱动:物理终端通过电缆连接到计算机上的 UART(通用异步接收器和发射器)。操作系统中有一个 UART 驱动程序用于管理字节的物理传输。
行规范:内核中的 Line discipline(行规范)用来提供一个编辑缓冲区和一些基本的编辑命令(退格,清除单个单词,清除行,重新打印),
主要用来支持用户在输入时的行为(比如输错了,需要退格)。
TTY 驱动:TTY 驱动用来进行会话管理,并且处理各种终端设备。

UART 驱动、行规范和 TTY 驱动都位于内核中,它们的一端是终端设备,另一端是用户进程。
因为在 Linux 下所有的设备都是文件,所以它们三个加在一起被称为 "TTY 设备",即我们常说的 TTY。


后来的终端慢慢演变成了键盘 + 显示器。
如果我们要把内容输出到显示器,只要把这些内容写入到显示器对应的 TTY 设备就可以了,然后由 TTY 层负责匹配合适的驱动完成输出,
这也是 Linux 控制台的工作原理。
TTY 驱动和行规范的行为与前面的示例类似,但不再有 UART 或物理终端。相反,软件仿真出视频终端,并最终被渲染到 VGA 显示器。
注意,这里出现了软件仿真终端,它们是运行在内核态的。


/dev/tty1-/dev/tty6 是这些仿真终端在文件系统中的表示,程序通过对这些文件的读写实现对仿真终端的读写。
如果我们在用户空间也进行终端仿真,情况会变得更加灵活;

为了便于将终端仿真移入用户空间,同时仍保持 TTY 子系统(TTY 子系统指 TTY 驱动和行规范)的完整,伪终端被发明了出来(pseudo terminal 或 pty)。
伪终端在内核中分为两部分,分别是 master side 和 在 TTY 驱动中实现的 slave side。


至此我们可以得出这样的结论:

现在所说的终端已经不是硬件终端了,而是软件仿真终端(终端模拟软件)


关于终端和伪终端,可以简单的理解如下:
真正的硬件终端基本上已经看不到了,现在所说的终端、伪终端都是软件仿真终端(即终端模拟软件);
一些连接了键盘和显示器的系统中,我们可以接触到运行在内核态的软件仿真终端(tty1-tty6);
通过 SSH 等方式建立的连接中使用的都是伪终端;
伪终端是运行在用户态的软件仿真终端;

Linux35_TTY和伪终端

标签:这一   sid   数据流   规范   line   cli   kde   部分   实现   

原文地址:https://www.cnblogs.com/grooovvve/p/14646213.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!