Linux--tty
Linux 终端(TTY)
TTY 是 Teletype 或 Teletypewriter 的缩写,原来是指电传打字机,后来这种设备逐渐键盘和显示器取代。不管是电传打字机还是键盘显示器,都是作为计算机的终端设备存在的,所以 TTY 也泛指计算机的终端(terminal)设备。为了支持这些 TTY 设备,Linux 实现了一个叫做 TTY 的子系统。所以 TTY 既指终端,也指 Linux 的 TTY 子系统。本文中演示部分使用的环境为 ubuntu 22.04。
硬件终端 terminal(TTY)
早期的终端(terminal) 是一台独立于计算机的机器(teletype 即, TTY),大概像下面的样子:
它终端通过线缆与计算机连接,并完成计算机的输入输出功能:
现在物理终端实际上已经灭绝了,我们看到的所有 TTY 都是模拟视频终端,即软件仿真出来的终端。可以通过 toe -a 命令查看系统支持的终端类型,该列表很长。
qz@ubuntu22:~$ toe -a
ergo4000 microterm ergo 4000
excel62-w datamedia Excel 62 in 132 char mode
excel62-rv datamedia Excel 62 in reverse video mode
emu emu native mode
env230 envision 230 graphics terminal
ecma+color color control for ECMA-48-compatible terminals
excel62 datamedia Excel 62
elks default ELKS console
elks-glasstty ELKS glass-TTY capabilities
elks-vt52 ELKS vt52 console
esprit-am hazeltine esprit auto-margin
eterm-color Emacs term.el terminal emulator term-protocol-version 0.96
emu-220 Emu-220 (vt200-7bit mode)
ep40 execuport 4000
esprit Hazeltine Esprit I
ecma+sgr attribute capabilities for true ECMA-48 terminals
.....................
控制台
提到终端就不能不提控制台 console。控制台的概念与终端含义非常相近,其实现在我们经常用它们表示相同的东西,但是在计算机的早期时代,它们确实是不同的东西。
一些数控设备(比如数控机床)的控制箱,通常会被称为控制台,顾名思义,控制台就是一个直接控制设备的面板,上面有很多控制按钮。 在计算机里,把那套直接连接在电脑上的键盘和显示器就叫做控制台。而终端是通过串口连接上的,不是计算机自身的设备,而控制台是计算机本身就有的设备,一个计算机只有一个控制台。**计算机启动的时候,所有的信息都会显示到控制台上,而不会显示到终端上。**这同样说明,控制台是计算机的基本设备,而终端是附加设备。计算机操作系统中,与终端不相关的信息,比如内核消息,后台服务消息,都可以显示到控制台上,但不会显示到终端上。比如在启动和关闭 Linux 系统时,我们可以在控制台上看到很多的内核信息(下图来自 vSphere Client 中的 “Virtual Machine Console”):
现在终端和控制台都由硬件概念,逐渐演化成了软件的概念。简单的说,能直接显示系统消息的那个终端称为控制台,其他的则称为终端(控制台也是一个终端)。或者我们在平时的使用中压根就不区分 Linux 中的终端与控制台。
Linux 总是把写入 /dev/console 的内容会显示在控制台中当前的虚拟终端(tty1-tty6)里。
TTY 设备
从历史上看,终端刚开始就是终端机,配有打印机,键盘,带有一个串口,通过串口传送数据到主机端,然后主机处理完交给终端打印出来。电传打字机(teletype)可以被看作是这类设备的统称,因此终端也被简称为 TTY(teletype 的缩写)。
如下图所示
UART 驱动
如上图所示,物理终端通过电缆连接到计算机上的 UART(通用异步接收器和发射器)。操作系统中有一个 UART 驱动程序用于管理字节的物理传输。
行规范
上图中内核中的 Line discipline(行规范)用来提供一个编辑缓冲区和一些基本的编辑命令(退格,清除单个单词,清除行,重新打印),主要用来支持用户在输入时的行为(比如输错了,需要退格)。
TTY 驱动
TTY 驱动用来进行会话管理,并且处理各种终端设备。
UART 驱动、行规范和 TTY 驱动都位于内核中,它们的一端是终端设备,另一端是用户进程。因为在 Linux 下所有的设备都是文件,所以它们三个加在一起被称为 “TTY 设备”,即我们常说的 TTY。
从软件仿真终端到伪终端
后来的终端慢慢演变成了键盘 + 显示器。如果我们要把内容输出到显示器,只要把这些内容写入到显示器对应的 TTY 设备就可以了,然后由 TTY 层负责匹配合适的驱动完成输出,这也是 Linux 控制台的工作原理(
上图中,TTY 驱动和行规范的行为与前面的示例类似,但不再有 UART 或物理终端。相反,软件仿真出视频终端,并最终被渲染到 VGA 显示器。注意,这里出现了软件仿真终端,它们是运行在内核态的。
tty1-tty6 都是软件仿真终端:
/dev/tty1-/dev/tty6 是这些仿真终端在文件系统中的表示,程序通过对这些文件的读写实现对仿真终端的读写。
如果我们在用户空间也进行终端仿真,情况会变得更加灵活,下图是 xterm 及其克隆的工作方式:
为了便于将终端仿真移入用户空间,同时仍保持 TTY 子系统(TTY 子系统指 TTY 驱动和行规范)的完整,伪终端被发明了出来(pseudo terminal 或 pty)。伪终端在内核中分为两部分,分别是 master side 和 在 TTY 驱动中实现的 slave side。注意上图中的 xterm,这是一个运行在用户态的终端仿真程序,比如 Ubuntu Desktop 中的 GNOME Terminal:
当创建一个伪终端时,会在 /dev/pts 目录下创建一个设备文件:
如果是通过 PuTTY 等终端仿真程序通过 SSH 的方式远程连接 Linux,那么终端仿真程序通过 SSH 与 PTY master side 交换数据。
终端与伪终端的区别
至此我们可以得出这样的结论:现在所说的终端已经不是硬件终端了,而是软件仿真终端(终端模拟软件)。
关于终端和伪终端,可以简单的理解如下:
- 真正的硬件终端基本上已经看不到了,现在所说的终端、伪终端都是软件仿真终端(即终端模拟软件)
- 一些连接了键盘和显示器的系统中,我们可以接触到运行在内核态的软件仿真终端(tty1-tty6)
- 通过 SSH 等方式建立的连接中使用的都是伪终端
- 伪终端是运行在用户态的软件仿真终端
总结
通过本文我们可以了解到,真正的硬件终端基本上已经看不到了。在一些连接了键盘和显示器的系统中(当然也包括一些 vsphere 等虚拟环境),我们可以接触到运行在内核态的软件仿真终端。而我们使用最多的则是伪终端。
相关文章:

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

一位女程序员的自述:我是如何成为前端工程师的
今天,我想和大家分享一下我的职场经历:我是如何成为一名前端工程师的,以及我为什么会选择这个职业。此外,大家比较关心的是我们为什么要出国工作呢?也是想给自己的职业生涯做一个阶段性的总结,尤其是作为一…...

C++命名空间详解
1.什么是命名空间 在c中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序…...

HDMI EDID概念梳理
EDID概念梳理: EDID数据格式: EDID包含两个部分,基本的EDID只有128个字节,还有128字节的扩展EDID,扩展部分不是必须有的。那通常电视都有扩展EDID。那EDID的详细定义在规范里面都可以找到,主要有以下几部分…...

Android端推送消息之极光推送
推送方式 轮询 --实现方式: 周期性主动获取网络中的数据; --缺点: 费电, 费流量; SMS --实现方式: 服务器端向手机端发送短信, 手机监听短信广播, 将拦截的短信信息进行显示; --优点: 省电, 省流量, 在没有网络的偏远地点也能接收到推送消息; --缺点: 费钱, 一毛钱一条;…...

2023测试工程师全新技术栈,吃透这些,起薪就15k
相信每个准备软件测试面试的同学,不管你是大学刚毕业,满心憧憬着进入公司实习、非计算机行业转行软件测试、自学测试就业还是培训后就业,都会面临着众多的疑问和不解,那就是该怎么走出着第一步,今天本文一次性告诉你&a…...

十、CNN卷积神经网络实战
一、确定输入样本特征和输出特征 输入样本通道数4、期待输出样本通道数2、卷积核大小33 具体卷积层的构建可参考博文:八、卷积层 设定卷积层 torch.nn.Conv2d(in_channelsin_channel,out_channelsout_channel,kernel_sizekernel_size,padding1,stride1) 必要参数&a…...

App 自动化测试
一、移动端测试基础 1 移动端自动化环境搭建 1.1 java安装 1.2 Android SDK安装 SDK (Software Development Kit) 软件开发工具包是软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。Android SDK 就是 Android 专属的软件开…...

考研英语知识点
考研英语知识点 一、在考研英语考试中,常考的英语时态 1.一般现在时 (Simple Present Tense) 一般现在时指的是现在正在进行或经常发生的事情。它用于描述普遍真理,频繁的习惯,以及现在正在发生的事情。例如:我每天早上六点起床…...

IPSEC实验(IPSECVPN点到点,DSVPN,IPSECVPN旁挂)
目录 一、复现实验1、防火墙的IPSECVPN点到点实验-1,拓扑图的搭建-2,配置IP,开通ping,并且设置策略-3,在网络中的IPSEC进行配置第一阶段:发出的UDP500流量第二阶段 发出的ESP流量二台防火墙建立策略禁用其它策略,在IPSEC上配置策略…...

从4k到42k,软件测试工程师的涨薪史,给我看哭了
清明节一过,盲猜大家已经无心上班,在数着日子准备过五一,但一想到银行卡里的余额……瞬间心情就不美丽了。 最近,2023年高校毕业生就业调查显示,本科毕业月平均起薪为5825元。调查一出,便有很多同学表示自己…...

tomcat作业
简述静态网页和动态网页的区别。 静态网页和动态网页是网站的两种基本类型。它们的主要区别在于它们如何生成和呈现网页内容。 静态网页是一种由服务器直接发送给用户的固定HTML文件,其中包含所有网页的内容和样式。这些页面不会随着用户的操作而改变,它…...

除了Java,还可以培训学习哪些IT技术?
除了Java,还可以培训学习哪些IT技术? 转行IT学Java似乎已经成为很多人的首选,原因无非是开发技术含量高、开发有前景、开发是一个互联网企业的核心岗位,最重要的是开发薪资待遇高。但其实只单纯因为薪资选择Java的话,小…...

Mysql优化(一)-- sql语句优化概述及数据库优化
1. sql语句优化 1.1 优化查询过程中的数据访问 访问数据太多导致查询性能下降确定应用程序是否在检索大量超过需要的数据,可能是太多行或列确认MySQL服务器是否在分析大量不必要的数据行避免犯如下SQL语句错误 查询不需要的数据。解决办法:使用limit解…...

深度学习快速参考:1~5
原文:Deep Learning Quick Reference 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如何实现目…...

软件设计师笔记-----程序设计语言与语言处理程序基础
文章目录 七、程序设计语言与语言处理程序基础7.1、编译与解释(低频)7.2、文法(低频)7.3、有限自动机与正规式(几乎每次都会考到)有限自动机正规式 7.4、表达式(偶尔考到)7.5、传值和…...

WebRTC 系列(三、点对点通话,H5、Android、iOS)
WebRTC 系列(二、本地 demo,H5、Android、iOS) 上一篇博客中,我已经展示了各端的本地 demo,大家应该知道 WebRTC 怎么用了。在本地 demo 中是用了一个 RemotePeerConnection 来模拟远端,可能理解起来还有点…...

RabbitMQ( 发布订阅模式 ==> DirectExchange)
本章目录: 何为DirectExchangeDirectExchange具体使用 一、何为DirectExchange 在上一篇文章中,讲述了FanoutExchange,其中publish向交换机发送消息时,我们并没有指定routkingKey,如下图所示 我们看看官方文档 之前使…...

Pytorch基础 - 5. torch.cat() 和 torch.stack()
目录 1. torch.cat(tensors, dim) 2. torch.stack(tensors, dim) 3. 两者不同 torch.cat() 和 torch.stack()常用来进行张量的拼接,在神经网络里经常用到。且前段时间有一个面试官也问到了这个知识点,虽然内容很小很细,但需要了解。 1. t…...

基于AIGC的3D场景创作引擎概述
通过改变3D场景制作流程复杂、成本高、门槛高、流动性差的现状,让商家像玩转2D一样去玩转3D,让普通消费者也能参与到3D内容创作和消费中,真正实现内容生产模式从PGC/UGC过渡到AIGC,是我们3D场景智能创作引擎一直追求的目标。 前言…...

C++算法恢复训练之快速排序
快速排序(Quick Sort)是一种基于分治思想的排序算法,它通过将待排序数组分成两个子数组,其中一个子数组的所有元素都比另一个子数组的元素小,然后对这两个子数组递归地进行排序,最终将整个数组排序。快速排…...

事务的特性
四大特性 原子性(atomicity) 事务的一系列操作,要么所有操作所有都成功,要么一个操作都不做 一致性(consistency) 指数据的规则,在事务前/后应保持一致,事务的原子性保证了一致性 隔离性&a…...

Python 计算三角形的面积、Python 阶乘实例
Python 计算三角形的面积 以下实例为通过用户输入三角形三边长度,并计算三角形的面积: # -*- coding: UTF-8 -*-# Filename : test.py # author by : www.w3cschool.cna float(input(输入三角形第一边长: )) b float(input(输入三角形第二边长: )) c …...

C++入门教程||C++ 重载运算符和重载函数||C++ 多态
C 重载运算符和重载函数 C 重载运算符和重载函数 C 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义&…...

docker+docker-compose+nginx前后端分离项目部署
文章目录 1.安装docker1.1 基于centos的安装1.2 基于ubuntu 2.配置国内加速器2.1 配置阿里云加速器🍀 找到相应页面🍀 创建 docker 目录🍀 创建 daemon.json 文件🍀 重新加载服务配置文件🍀 重启 docker 引擎 2.2 配置…...

基于PCA与LDA的数据降维实践
基于PCA与LDA的数据降维实践 描述 数据降维(Dimension Reduction)是降低数据冗余、消除噪音数据的干扰、提取有效特征、提升模型的效率和准确性的有效途径, PCA(主成分分析)和LDA(线性判别分析࿰…...

【Hello Network】网络编程套接字(一)
作者:小萌新 专栏:网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍网络的基础概念 网络编程套接字(一) 预备知识源ip和目的ip端口号TCP和UDP协议网络中的字节序 socket编程接口socket常…...

【计算机网络】学习笔记:第二章 物理层(五千字详细配图)【王道考研】
创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...

直流有刷电机的电路分析
这里写目录标题 H桥改进后的电路L298N原理图野火的电机驱动板MOS管野火的原理图 H桥 当 Q1 和 Q4 导通时,电流将经过 Q1 从左往右流过电机,在经过 Q4 流到电源负极,这时图中电机可以顺时针转动。 当 Q3 和 Q2 导通时,电流将经过 Q…...

使用PowerShell自动部署ASP.NetCore程序到IIS
asp.net core 安装asp.net core sdk https://dotnet.microsoft.com/en-us/download/dotnet/3.1 创建asp.net core项目 dotnet new webapi运行项目 访问https://localhost:5001/WeatherForecast iis配置 安装iis 以管理员身份运行powershell Enable-WindowsOptiona…...