- /dev/ptmx 是 UNIX 98 master克隆设备 来源
- 当进程打开 /dev/ptmx 时,它会得到一个文件描述符对于伪终端主设备 (PTM),在 /dev/pts 目录中创建伪终端从设备 (PTS)来源。有没有节点在主设备的文件系统中来源。
- 写入从机的数据呈现在主机上描述符作为输入。写入主机的数据作为输入呈现给从机来源。
- 在 Unix 和相关计算机操作系统中,文件描述符(FD,不太常见的 fildes)是一个抽象指示符(句柄),用于访问文件文件或其他输入/输出资源,例如管道或网络套接字来源。
结论:
- /dev/ptmx 只是一种克隆 master 的“模具”(实际上是文件描述符)。
- 伪终端是一对提供双向通信的虚拟设备。通道的一端是文件描述符(master)另一个是/dev/pts/n设备(奴隶)。
- 没有 PTM 设备,只有文件描述符。
- 文件描述符用于访问文件或者资源。
问题 :
- 文件描述符处理的 PTM 资源位于哪里?
- 为什么我们称PTM master为“设备”?因为 /dev 中没有它的条目。
- 可以一个修改的像SSHD这样的程序直接与PTS通信而无需中间的PTM?
答案1
要理解伪终端的工作原理,您必须将它们视为真实物理终端的抽象。如今,最常见的物理终端是 Linux 虚拟控制台,但在当时,真实的物理终端非常普遍,而且往往是用户在日常工作中看到的计算机系统的唯一部分。
真实的物理终端有两个截然不同的侧面(如果您愿意,可以称为“方面”):
“外侧”,用户坐的地方。这一侧有一个键盘,用户可以在上面输入字符,还有一个屏幕,用户可以在上面看到计算机输出。在伪终端抽象中,这是“主”端。
“内部”一侧,由操作系统中的字符设备表示。在伪终端抽象中,这是“从”端。
在物理终端的“外部”侧和程序用于与用户通信的“内部”字符设备之间,存在一整套处理过程;终端硬件本身更新屏幕,操作系统可以缓冲用户击键并执行行编辑等。
Digital Equipment Corporation VT220 终端。你正在看它的“正面”。对于伪终端,这由“主”端表示。图片来自维基媒体。
文件描述符处理的 PTM 资源位于哪里?
它们位于内核内存中。当进程打开时,
/dev/ptmx
内核创建一个新的伪终端,由主端和从端组成; master 端属于创建它的进程,因此不需要/dev
;中的条目。从机端可以由任何想要与终端通信的进程打开,因此需要 中的条目/dev
。为什么我们称PTM master为“设备”?因为 /dev 中没有它的条目。
我们通常不称其为设备。我们通常称其为伪终端的主端。但是,是的,它更像是字符设备而不是常规文件。例如,持有它的进程无法查找先前的位置——它只能读取新字节或写入新字节。
像 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
但如果没有支持声音的彩色终端的原始发明者的清晰图片,我永远不会意识到这一切。