PTS Slave如何与PTM文件描述符通信?

PTS Slave如何与PTM文件描述符通信?
  1. /dev/ptmx 是 UNIX 98 master克隆设备 来源
  2. 当进程打开 /dev/ptmx 时,它会得到一个文件描述符对于伪终端主设备 (PTM),在 /dev/pts 目录中创建伪终端从设备 (PTS)来源。有没有节点在主设备的文件系统中来源
  3. 写入从机的数据呈现在主机上描述符作为输入。写入主机的数据作为输入呈现给从机来源
  4. 在 Unix 和相关计算机操作系统中,文件描述符(FD,不太常见的 fildes)是一个抽象指示符(句柄),用于访问文件文件或其他输入/输出资源,例如管道或网络套接字来源

结论:

  1. /dev/ptmx 只是一种克隆 master 的“模具”(实际上是文件描述符)。
  2. 伪终端是一对提供双向通信的虚拟设备。通道的一端是文件描述符(master)另一个是/dev/pts/n设备(奴隶)。
  3. 没有 PTM 设备,只有文件描述符。
  4. 文件描述符用于访问文件或者资源

问题 :

  1. 文件描述符处理的 PTM 资源位于哪里?
  2. 为什么我们称PTM master为“设备”?因为 /dev 中没有它的条目。
  3. 可以一个修改的像SSHD这样的程序直接与PTS通信而无需中间的PTM?

答案1

要理解伪终端的工作原理,您必须将它们视为真实物理终端的抽象。如今,最常见的物理终端是 Linux 虚拟控制台,但在当时,真实的物理终端非常普遍,而且往往是用户在日常工作中看到的计算机系统的唯一部分。

真实的物理终端有两个截然不同的侧面(如果您愿意,可以称为“方面”):

  • “外侧”,用户坐的地方。这一侧有一个键盘,用户可以在上面输入字符,还有一个屏幕,用户可以在上面看到计算机输出。在伪终端抽象中,这是“主”端。

  • “内部”一侧,由操作系统中的字符设备表示。在伪终端抽象中,这是“从”端。

在物理终端的“外部”侧和程序用于与用户通信的“内部”字符设备之间,存在一整套处理过程;终端硬件本身更新屏幕,操作系统可以缓冲用户击键并执行行编辑等。

数字设备公司 VT220 终端

Digital Equipment Corporation VT220 终端。你正在看它的“正面”。对于伪终端,这由“主”端表示。图片来自维基媒体。

  1. 文件描述符处理的 PTM 资源位于哪里?

    它们位于内核内存中。当进程打开时,/dev/ptmx内核创建一个新的伪终端,由主端和从端组成; master 端属于创建它的进程,因此不需要/dev;中的条目。从机端可以由任何想要与终端通信的进程打开,因此需要 中的条目/dev

  2. 为什么我们称PTM master为“设备”?因为 /dev 中没有它的条目。

    我们通常不称其为设备。我们通常称其为伪终端的主端。但是,是的,它更像是字符设备而不是常规文件。例如,持有它的进程无法查找先前的位置——它只能读取新字节或写入新字节。

  3. 像 SSHD 这样的修改程序可以直接与 PTS 通信而无需中间的 PTM 吗?

    sshd 不与伪终端的从属端通信。 sshd 持有伪终端的 master 端;从机端由 Sshd 生成的进程(例如 shell)使用。

    sshd 的工作原理如下:

    • 当登录请求通过网络发出并且用户通过身份验证时,Sshd 会创建一个新的伪终端;它持有主端,然后根据远程用户(通常是 shell)的要求生成一个进程,将伪终端的从端作为标准输入、标准输出和标准错误。

    • 从网络接收到的字符由Sshd写入到伪终端的master端;这模拟用户在键盘上打字。内核处理(或不处理)该字符流。具有伪终端从属端的进程(例如,外壳)接收它们,就好像它正在与真实终端通信一样。

    • 在主设备和从设备之间有操作系统内核,它可以根据从设备的状态来执行某些处理或不执行某些处理。看线路纪律,以及手册页stty(1) 和ioctl(2)(特别是应用于终端或伪终端的从属端)。

 _______             ______       ______       ______       _____       ______
(       ) bytes in  |      |     |      |     |      |     |     |     | Bash |
(Network)---------->| Sshd |---->|Master|---->|  OS  |---->|Slave|---->|  Vi  |
(       )<----------|      |<----| PTY  |<----|kernel|<----| PTY |<----| Less |
(_______) bytes out |______|     |______|     |______|     |_____|     |______|

 _______           _____      ______      ______      _____      _____      _______
<       > Events  |     |    |      |    |      |    |     |    |     |    (       )
<  GUI  >-------->|Xterm|--->|Master|--->|  OS  |--->|Slave|--->| Ssh |--->(Network)
<       ><--------|     |<---| PTY  |<---|kernel|<---| PTY |<---|     |<---(       )
<_______> Drawing |_____|    |______|    |______|    |_____|    |_____|    (_______)

答案2

当我转到这个 oracle 链接的顶部时,我找到了“前言”:

STREAMS 编程指南介绍了如何使用 STREAMS 设计和实现应用程序以及 STREAMS 模块和驱动程序,以实现符合以下要求的体系结构:SolarisTM 7DDI/DDK。

Solaris7 是从 1998 年到 2010 年的。这个 oracle/solaris 链接仍然用注释良好的 C 代码解释了设置:

fdm = open("/dev/ptmx", O_RDWR);  /* open master */
grantpt(fdm);                     /* change permission of slave */
unlockpt(fdm);                    /* unlock slave */
slavename = ptsname(fdm);         /* get name of slave */
fds = open(slavename, O_RDWR);    /* open slave */

隔离这两行,其中打开了 char dev:

fdm = open("/dev/ptmx", O_RDWR);    /* open master */
fds = open( slavename,  O_RDWR);    /* open slave */

你看到了对称性......唯一的区别是:

  • 频分复用的用途string "/dev/ptmx"
  • fds 使用variable slavename(包含像...这样的字符串?(奖励 Q))

当然,链接是在这里完成的:slavename = ptsname(fdm)。用简单的英语来说:返回属于打开主设备返回的 fd 的从设备名称。没有人说是琐碎的

或者这是一个错字?不!您需要找出 ptsname() 来找出主方已分配给您所持有的“票”的号码/名称(/dev/pts/8、/dev/pts/17,...)(即 fdm“handlle”) ”)。

man ptsname

点名()函数返回从属伪终端设备的名称相应的给主人提到由FD。

两次打开伪设备来获取文件描述符“fd_”,但第一次 fdm “仅”获取 fds。然后使用 fds 来读写该新的从端设备。

提醒酒店客人先从公共房间拿到私人房间的钥匙。


real physical VT但如果没有支持声音的彩色终端的原始发明者的清晰图片,我永远不会意识到这一切。

相关内容