Linux内核TTY子系统有什么(6)

接前一篇文章:Linux内核TTY子系统有什么(5)

本文内容参考:

Linux TTY子系统框架-CSDN博客

一文彻底讲清Linux tty子系统架构及编程实例-CSDN博客

linux TTY子系统(3) - tty driver_sys tty device driver-CSDN博客

Linux TTY 子系统框架_linux tty体系-CSDN博客

LinuxTTY 子系统2_tty子系统-CSDN博客

Linux TTY Driver_tty driver配置-CSDN博客

UART驱动学习二(TTY体系)_serdev-CSDN博客

解密TTY - QiuhaoLi - 博客园

特此致谢!

一、TTY是什么?

2. TTY的分类

Linux系统的终端设备一般分为控制台、伪终端pty、串口终端(/dev/ttySn)和其它类型。

(4)伪终端PTY

上一回阐述了伪终端(Pesudo Terminal,PTY)的基本原理,内容比较简单明了。本回在前一回认知的基础上,讲解更为详细、复杂的内容。

上一回提到,伪终端分为主设备(主终端)和从设备(从终端)。

  

简单来说,主终端(master)与类似sshd、telnetd等用户空间的远程协议处理进程连接;而从终端(slave)则与shell之类的实际进程连接。在处理远程登录的时候,一般都是由远程协议处理进程打开主终端和从终端,然后就在远程网络终端和本机shell之间建立了一条双向通道:

远程网络终端(套接字) <---> 本机协议处理进程 <---> 主终端 <---> 从终端 <---> shell

在这个“打开主从终端建立连接”的语义以及其实现上,有着不同的标准,总的来说有三种方式:SVR4BSDLinux方式。

在“建立连接”的语义上,SVR4的方式使用“流”来建立这条连接,而BSD和Linux则是自动建立的。

可见Linux处理伪终端的方式是结合SVR4和BSD两种UNIX标准的结果。Linux不仅实现这种有意义的最佳组合,而且分别实现了SRV和BSD的两种方式的接口。如果编译CONFIG_LEGACY_PTYS宏,则可以使用BSD的方式;如果编译CONFIG_UNIX98_PTYS,则实现SRV4的接口。

  • BSD接口

机制相对简单。master为/dev/pty[p-za-e] [0-9a-f];slave为/dev/tty[p-za-e] [0-9a-f],它们都是配对出现的(例如/dev/ptyp3和/dev/ttyp3)。但由于在编程时要找到一个合适的终端需要逐个尝试,所以逐渐被放弃。

  • Unix 98接口(SRV4)

仅使用一个/dev/ptmx作为master设备,任何sshd、telnetd之类的进程都可以只使用这一个终端设备文件,在每次打开操作时会得到一个master设备fd,并在/dev/pts/目录下得到一个slave设备(如/dev/pts/3和/dev/ptmx),这样就避免了逐个尝试的麻烦。在ptmx_open函数中,不仅系统可以自动分配一个主终端,而且还为该主终端绑定了一个从终端,主终端设置到file结构体的private_data字段上,之后诸如sshd、telnetd之类的进程读写/dev/ptmx文件时,虽然它们读写的是同一个文件,可是由于file结构体不在它们之间共享,因此它们取到的file->private_data也就不同了。 

由于可能有好几千个用户登录,因此/dev/pts/*是动态生成的,不像其它设备文件那样,是构建系统时就已经产生的硬盘节点(如果未使用devfs、udev、mdev等)。第一个用户登录,设备文件为/dev/pts/0;第二个为/dev/pts/1,依次类推。它们并不与实际物理设备直接相关。现在大多数系统是通过此接口实现pty。

在X Window下打开的终端或使用telnet或ssh等方式登录Linux主机,此时均通过pty设备。例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会打开/dev/ptmx设备获取一个fd。此时一个getty程序就应该运行在对应的/dev/pts/* 上。当telnet从远端获取了一个字符时,该字符就会通过ptmx、pts/* 传递给getty程序,而getty程序就会通过pts/* 、ptmx和telnet程序往网络上返回“login:”字符串信息。这样,登录程序与telnet程序就通过“伪终端”进行通信。

  • telnet<—>/dev/ptmx(master)<—>pts/*(slave)<—>getty

   

如果一个程序把pts/*看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对的另一个/dev/ptmx上,而/dev/ptmx则是另一个程序用于读写操作的逻辑设备。这样,两个程序就可以通过这种逻辑设备进行互相交流,这很象是逻辑设备对之间的管道操作。对于pts/* ,任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用/dev/ptmx的程序,则需要专门设计来使用/dev/ptmx逻辑设备。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。

最后,举一个完整的实例。

  • Tmux Server打开一对伪终端(pts/2和ptmx),自己持有主设备(ptmx),将从设备继承给它Fork出来的Bash。此一对进程进入后台,不再归属任何终端。
  • 一旦Tmux Client运行于某个SSH终端,它会把当前终端的pts传递给Tmux Server,从而让Tmux Server作为一个数据代理传递输入和输出。
  • 一旦Tmux Client运行,它便成为了当前Bash的前台进程,通过重定向之后,当前Tmux Client便成为了Bash0的前端,接收Bash0的输入和输出。文件句柄转交后的流程如下:

 1)有人在远端的Windows主机上敲入一个字符“a”;

 2)字符“a”经由SSH客户端加密后传输到Linux SSH服务器SSHd并解密;

 3)字符“a”通过SSHd的ptmx写入;

 4)Tmux Server从pts/2将字符“a”读出并写入ptmx;

 5)Bash0将字符“a”从pts/1读出并执行;

 6)Bash0将“-bash: a: command not found”按原路返回给Windows。

更多内容请看下回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/505763.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

03_Redis基本操作

1.Redis查询命令 1.1 官网命查询命令 为了便于学习Redis,官方将其用于操作不同数据类型的命令进行了分类整理。你可以通过访问Redis官方网站上的命令参考页面https://redis.io/commands来查阅这些分组的命令,这有助于更系统地理解和使用Redis的各项功能。 1.2 HELP查询命令…

@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…

kubernetes第七天

1.影响pod调度的因素 nodeName 节点名 resources 资源限制 hostNetwork 宿主机网络 污点 污点容忍 Pod亲和性 Pod反亲和性 节点亲和性 2.污点 通常是作用于worker节点上&#xff0c;其可以影响pod的调度 语法&#xff1a;key[value]:effect effect:[ɪˈfek…

FFmpeg Muxer HLS

使用FFmpeg命令来研究它对HLS协议的支持程度是最好的方法&#xff1a; ffmpeg -h muxerhls Muxer HLS Muxer hls [Apple HTTP Live Streaming]:Common extensions: m3u8.Default video codec: h264.Default audio codec: aac.Default subtitle codec: webvtt. 这里面告诉我…

maven高级(day15)

Maven 是一款构建和管理 Java 项目的工具 分模块设计与开发 所谓分模块设计&#xff0c;顾名思义指的就是我们在设计一个 Java 项目的时候&#xff0c;将一个 Java 项目拆分成多 个模块进行开发。 分模块设计我们在进行项目设计阶段&#xff0c;就可以将一个大的项目拆分成若干…

【json】

JSON JSON是一种轻量级的,按照指定的格式去组织和封装数据的数据交互格式。 本质上是一个带有特定格式的字符串(py打印json时认定为str类型) 在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互,类似于计算机普通话 python与json关系及相互转换…

计算机网络 笔记 数据链路层 2

1,信道划分&#xff1a; (1)时分复用TDM 将时间等分为“TDM帧”&#xff0c;每个TDM帧内部等分为m个时隙&#xff0c;m个用户对应m个时隙 缺点&#xff1a;每个节点只分到了总带宽的1/m,如果有部分的1节点不发出数据&#xff0c;那么就会在这个时间信道被闲置&#xff0c;利用…

OpenPCDet从环境配置到模型训练

一、环境安装: 操作系统 :ubuntu 20.04+docker [11.8.0-cudnn8-devel-ubuntu18.04] 代码下载地址:GitHub - open-mmlab/OpenPCDet: OpenPCDet Toolbox for LiDAR-based 3D Object Detection.OpenPCDet Toolbox for LiDAR-based 3D Object Detection. - open-mmlab/OpenPCD…

【Python】Python与C的区别

文章目录 语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数数据输出print()函数 语句结束符 C 语言 C 语言中每条语句必须以分号;结束。例如&#xff0c;int a 10;、printf("Hello, World!");。分号是语句的一部分&#xff0c;用于…

了解模2除法:原理与应用

模2除法&#xff0c;也被称为二进制除法或XOR除法&#xff0c;是一种在二进制数制下进行的特殊除法运算。与常规的十进制或其他进制的除法不同&#xff0c;模2除法使用异或&#xff08;XOR&#xff09;运算代替减法&#xff0c;并且不涉及进位或借位。这种除法运算在数字通信、…

【GESP】C++二级练习 luogu-B2079, 求出 e 的值

GESP二级练习&#xff0c;循环语句嵌套&#xff0c;难度★✮☆☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-2-luogu-b2079/ https://www.coderli.com/gesp-2-luogu-b2079/https://www.coderli.com/gesp-2-luogu-b2079/

鼠标自动移动防止锁屏的办公神器 —— 定时执行专家

目录 ◆ 如何设置 ◇ 方法1&#xff1a;使用【执行Nircmd命令】任务 ◇ 方法2&#xff1a;使用【模拟键盘输入】任务 ◆ 定时执行专家介绍 ◆ 定时执行专家最新版下载 ◆ 如何设置 ◇ 方法1&#xff1a;使用【执行Nircmd命令】任务 1、点击工具栏第一个图标【新建任务】&…

2025新年源码免费送

2025很开门很开门的源码免费传递。不需要馒头就能获取4套大开门源码。 听泉偷宝&#xff0c;又进来偷我源码啦&#x1f44a;&#x1f44a;&#x1f44a;。欢迎偷源码 &#x1f525;&#x1f525;&#x1f525; 获取免费源码以及更多源码&#xff0c;可以私信联系我 我们常常…

微信小程序实现登录注册

文章目录 1. 官方文档教程2. 注册实现3. 登录实现4. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/路由跳转的几种方式&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab…

1. Doris分布式环境搭建

一. 环境准备 本次测试集群采用3台机器hadoop1、hadoop2、hadoop3, Frontend和Backend部署在同一台机器上&#xff0c;Frontend部署3台组成高可用&#xff0c;Backend部署3个节点&#xff0c;组成3副本存储。 主机IP操作系统FrontendBackendhadoop1192.168.47.128Centos7Foll…

docker-compose安装canal并利用rabbitmq同步多个mysql数据

必看&#xff1a;本文默认已经安装好了docker-compose、rabbitmq、mysql并且mysql开启了binlog日志&#xff0c;不需要再安装&#xff1b; 流程图 如上图所示&#xff0c;左边是MQ模式流程图&#xff0c;右边则是TCP模式的流程图&#xff1b; 最终的目的是利用canal监听多个M…

ue5动画重定向,一键重定向。ue4小白人替换成ue5

这就是我们下载的 初学者动画内容包 点击设置选中列 绿色的是动画 黄色的关卡 蓝色是蓝图 ctrla 全选 ctrl鼠标左键 选中所有动画 重定向动画资产 不要选错&#xff0c;只要绿色 选择目标网格体 选择所有的绿色 动画 导出动画 添加前缀ycn 导出 一定要提前新建好存放的…

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架&#xff0c;专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括&#xff1a; 高效的抓取性能&#xff1a;Scrapy 采用了异步机制&#xff0c;能够高效…

Hadoop3.x 万字解析,从入门到剖析源码

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

RabbitMQ介绍与使用

RabbitMQ官网 RabbitMQ 介绍 RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;基于 AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;使用 Erlang 编程语言构建。它是消息队列&#xff08;MQ&#xff09;的一种&#xff0c;广泛应用于分布式系统中&#x…