这篇文章主要介绍了Linux中TTY/PTS有什么区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
Linux TTY/PTS概述
当我们在键盘上敲下一个字母的时候,到底是怎么发送到相应的进程的呢?我们通过ps、who等命令看到的类似tty1、pts/0这样的输出,它们的作用和区别是什么呢?在计算机出来以前,人们就已经在使用一种叫teletype的设备,用来相互之间传递信息,看起来像下面这样:两个teletype之间用线连接起来,线两端可能也有类似于调制解调器之类的设备(这里将它们忽略),在一端的teletype上敲键盘时,相应的数据会发送到另一端的teletype,具体功能是干什么的,我也不太了解。(我脑袋里面想到画面是在一端敲字,另一端打印出来)这些都是老古董了,完全没接触过,所以只能简单的推测。等到计算机支持多任务后,人们想到把这些teletype连到计算机上,作为计算机的终端,从而可以操作计算机。使用teletype的主要原因有两个(个人见解):现实中已经存在了大量不同厂商的teletype,可以充分利用现有资源telety开发云主机域名pe的相关网络已经比较成熟,连起来方便于是连接就发展成这样:左边的Terminal就是各种各样的teletype物理线路两边用上了Modem,就是我们常说的“猫”,那是因为后来网络已经慢慢的变发达了,大家可以共享连接了。(大概推测,可能不对)UART可以理解为将teletype的信号转换成计算机能识别的信号的设备计算机为了支持这些teletype,于是设计了名字叫做TTY的子系统,内部结构如下:UART driver对接外面的UART设备Line disciplin开发云主机域名e主要是对输入和输出做一些处理,可以理解它是TTY driver的一部分TTY driver用来处理各种终端设备用户空间的进程通过TTY driver来和终端打交道为了简单起见,后面的介绍中不再单独列出UART driver和Line discipline,可以认为它们是TTY driver的一部分对于每一个终端,TTY driver都会创建一个TTY设备与它对应,如果有多个终端连接过来,那么看起来就是这个样子的:当驱动收到一个终端的连接时,就会根据终端的型号和参数创建相应的tty设备(上图中设备名称叫ttyS0是因为大部分终端的连接都是串行连接),由于每个终端可能都不一样,有自己的特殊命令和使用习惯,于是每个tty设备的配置可能都不一样。比如按delete键的时候,有些可能是要删前面的字符,而有些可能是删后面的,如果没配置对,就会导致某些按键不是自己想要的行为,这也是我们在使用模拟终端时,如果默认的配置跟我们的习惯不符,需要做一些个性化配置的原因。后来随着计算机的不断发展,teletype这些设备逐渐消失,我们不再需要专门的终端设备了,每个机器都有自己的键盘和显示器,每台机器都可以是其它机器的终端,远程的操作通过ssh来实现,但是内核TTY驱动这一架构没有发生变化,我们想要和系统中的进程进行I/O交互,还是需要通过TTY设备,于是出现了各种终端模拟软件,并且模拟的也是常见的几种终端,如VT100、VT220、XTerm等。可以通过命令
toe -a
列出系统支持的所有终端类型可以通过命令infocmp来比较两个终端的区别,比如
infocmp vt100 vt220
将会输出vt100和vt220的区别。在讨论TTY设备是如何被创建及配置之前,我们先来看看TTY是如何被进程使用的:pts也是tty设备,它们的关系后面会介绍到通过上面的lsof可以看出,当前运行的bash和lsof进程的stdin(0u)、stdout(1u)、stderr(2u)都绑定到了这个TTY上。下面是tty和进程以及I/O设备交互的结构图:可以把tty理解成一个管道(pipe),在一端写的内容可以从另一端读取出来,反之亦然。这里input和output可以简单的理解为键盘和显示器,后面会介绍在各种情况下input/ouput都连接的什么东西。tty里面有一个很重要的属性,叫Foreground process group,记录了当前前端的进程组是哪一个。process group的概念会在下一篇文章中介绍,这里可以简单的认为process group里面只有一个进程。当pts/1收到input的输入后,会检查当前前端进活动:慈云数据爆款香港服务器,CTG+CN2高速带宽、快速稳定、平均延迟10+ms 速度快,免备案,每月仅需19元!! 点击查看程组是哪一个,然后将输入放到进程组的leader的输入缓存中,这样相应的leader进程就可以通过read函数得到用户的输入当前端进程组里面的进程往tty设备上写数据时,tty就会将数据输出到output设备上当在shell中执行不同的命令时,前端进程组在不断的变化,而这种变化会由shell负责更新到tty设备中从上面可以看出,进程和tty打交道很简单,只要保证后台进程不要读写tty就可以了,即写后台程序时,要将stdin/stdout/stderr重定向到其它地方(当然deamon程序还需要做很多其它处理)。先抛出两个问题(后面有答案):当非前端进程组里面的进程(后台进程)往tty设备上写数据时,会发生什么?会输出到outpu上吗?当非前端进程组里面的进程(后台进程)从tty设备上读数据时,会发生什么?进程会阻塞吗?下面介绍几种常见的情况下tty设备是如何创建的,以及input和output设备都是啥。先看图再说话:键盘、显示器都和内核中的终端模拟器相连,由模拟器决定创建多少tty,比如你在键盘上输入ctrl+alt+F1时,模拟器首先捕获到该输入,然后激活tty1,这样键盘的输入会转发到tty1,而tty1的输出会转发到显示器,同理用输入ctrl+alt+F2,就会切换到tty2。当模拟器激活tty时如果发现没有进程与之关联,意味着这是第一次打开该tty,于是会启动配置好的进程并和该tty绑定,一般该进程就是负责login的进程。当切换到tty2后,tty1里面的输出会输出到哪里呢?tty1的输出还是会输出给模拟器,模拟器里会有每个tty的缓存,不过由于模拟器的缓存空间有限,所以下次切回tty1的时候,只能看到最新的输出,以前的输出已经不在了。不确定这里开发云主机域名的终端模拟器对应内核中具体的哪个模块,但肯定有这么个东西存在这里的Terminal可能是任何地方的程序,比如windows上的putty,所以不讨论客户端的Terminal程序是怎么和键盘、显示器交互的。由于Terminal要和ssh服务器打交道,所以肯定要实现ssh的客户端功能。这里将建立连接和收发数据分两条线路解释,为了描述简洁,这里以sshd代替ssh服务器程序:1.Terminal请求和sshd建立连接2.如果验证通过,sshd将创建一个新的session3.调用API(posix_openpt())请求ptmx创建一个pts,创建成功后,sshd将得到和ptmx关联的fd,并将该fd和session关联起来。
本文从转载,原作者保留一切权利,若侵权请联系删除。
《Linux中TTY/PTS有什么区别》来自互联网同行内容,若有侵权,请联系我们删除!
还没有评论,来说两句吧...