当前位置 主页 > 服务器问题 > Linux/apache问题 >

    概述Linux TTY/PTS的区别

    栏目:Linux/apache问题 时间:2019-12-12 15:43

    当我们在键盘上敲下一个字母的时候,到底是怎么发送到相应的进程的呢?我们通过ps、who等命令看到的类似tty1、pts/0这样的输出,它们的作用和区别是什么呢?

    TTY历史

    支持多任务的计算机出现之前

    在计算机出来以前,人们就已经在使用一种叫teletype的设备,用来相互之间传递信息,看起来像下面这样:

    +----------+   Physical Line   +----------+
    | teletype |<--------------------->| teletype |
    +----------+            +----------+
    

    两个teletype之间用线连接起来,线两端可能也有类似于调制解调器之类的设备(这里将它们忽略),在一端的teletype上敲键盘时,相应的数据会发送到另一端的teletype,具体功能是干什么的,我也不太了解。(我脑袋里面想到画面是在一端敲字,另一端打印出来)

    这些都是老古董了,完全没接触过,所以只能简单的推测。

    支持多任务的计算机出现之后

    等到计算机支持多任务后,人们想到把这些teletype连到计算机上,作为计算机的终端,从而可以操作计算机。

    使用teletype的主要原因有两个(个人见解):

    现实中已经存在了大量不同厂商的teletype,可以充分利用现有资源 teletype的相关网络已经比较成熟,连起来方便

    于是连接就发展成这样:

                                       +----------+ 
    +----------+  +-------+   Physical Line   +-------+  +------+  |     |
    | Terminal |<->| Modem |<--------------------->| Modem |<->| UART |<->| Computer |
    +----------+  +-------+            +-------+  +------+  |     |
                                       +----------+
    左边的Terminal就是各种各样的teletype 物理线路两边用上了Modem,就是我们常说的“猫”,那是因为后来网络已经慢慢的变发达了,大家可以共享连接了。(大概推测,可能不对) UART可以理解为将teletype的信号转换成计算机能识别的信号的设备

    内核TTY子系统

    计算机为了支持这些teletype,于是设计了名字叫做TTY的子系统,内部结构如下:

      +-----------------------------------------------+
      |          Kernel           |
      |                 +--------+  |
      |  +--------+  +------------+  |    |  |    +----------------+
      |  | UART |  |  Line  |  | TTY  |<---------->| User process A |
    <------>|    |<->|      |<->|    |  |    +----------------+
      |  | driver |  | discipline |  | driver |<---------->| User process B |
      |  +--------+  +------------+  |    |  |    +----------------+
      |                 +--------+  |
      |                        |
      +-----------------------------------------------+
    
    UART driver对接外面的UART设备 Line discipline主要是对输入和输出做一些处理,可以理解它是TTY driver的一部分 TTY driver用来处理各种终端设备 用户空间的进程通过TTY driver来和终端打交道

    为了简单起见,后面的介绍中不再单独列出UART driver和Line discipline,可以认为它们是TTY driver的一部分

    TTY设备

    对于每一个终端,TTY driver都会创建一个TTY设备与它对应,如果有多个终端连接过来,那么看起来就是这个样子的:

               +----------------+
               |  TTY Driver  |
               |        |
               |  +-------+  |    +----------------+
     +------------+    |  |    |<---------->| User process A |
     | Terminal A |<--------->| ttyS0 |  |    +----------------+
     +------------+    |  |    |<---------->| User process B |
               |  +-------+  |    +----------------+
               |        |
               |  +-------+  |    +----------------+
     +------------+    |  |    |<---------->| User process C |
     | Terminal B |<--------->| ttyS1 |  |    +----------------+
     +------------+    |  |    |<---------->| User process D |
               |  +-------+  |    +----------------+
               |        |
               +----------------+