【问题标题】:What does openpty() do? What does it mean that "the openpty() function finds an available pseudoterminal"?openpty() 有什么作用? “openpty() 函数找到可用的伪终端”是什么意思?
【发布时间】:2017-12-14 05:58:00
【问题描述】:

我觉得这个问题很愚蠢(“只是 RTFM!”),但我无法理解这个手册页。 man page blurb 描述 openpty()

openpty() 函数找到一个可用的伪终端并返回 amaster 和 aslave 中主从的文件描述符。如果 name 不为 NULL,在 name 中返回从站的文件名。如果 termp 不为 NULL,slave 的终端参数将被设置为 术语中的值。如果winp不为NULL,slave的窗口大小 将设置为 winp 中的值。

这是什么意思?

我的猜测是openpty() 试图找到与进程树中较高的终端仿真器相对应的伪终端(某个 nth-parent,即程序运行的终端仿真器,如果有的话)。但是,文档听起来像是 openpty() 只是随意地从 /dev/pts 中获取了一些东西。

另外,这里的“可用”是什么意思?似乎“可用”在伪终端的上下文中具有多种含义(例如,内核将让终端模拟器创建一个伪终端,一个可以读/写的伪终端)。

【问题讨论】:

  • 内核对终端模拟器一无所知。或者,换句话说,没有可以用来说“我是终端仿真器,给我额外特权”的系统界面。 (很明显,如果特权很重要,您就不能信任进程的声明。)如果没有进程打开它,则可以使用伪终端。而openpty 会为您找到一个这样的人(通过任意从池中抓取一个)。
  • 是的,它调用 openpty。或者它会打开 ptys 直到找到一个未使用的对象,这实际上就是 openpty 所做的。
  • @praxeolitic:在原始 BSD 实现中,所有设备(包括伪终端)都是静态创建和命名的,您只需在已知 pty 名称列表中尝试open/dev/ptyp0,@ 987654330@, ...) 直到找到open 成功的一个。
  • @Praxeolitic 我记不清了,但是在使用openpty() 之前,我们使用了可能的伪术语名称的循环并尝试打开每个,如果报告不可用失败(不记得哪个失败) .
  • @rici 的评论可以很好地补充这里的任何答案。如果不是因为 /dev/ttyp*/dev/ptyp* 的历史,我们永远不会使用“找到可用的伪终端”这个短语。如果您希望它只描述较新的 /dev/pts/ 实现,这里的文档会非常尴尬

标签: linux unix terminal pty


【解决方案1】:

但是,文档使它听起来像 openpty() 只是任意抓取 /dev/pts 之外的东西。

就是这样。

另外,这里的“可用”是什么意思?似乎“可用”有 伪终端上下文中的多种含义(例如内核 会让终端模拟器创建一个伪终端,一个伪终端 可以读/写)。

可用只是表示当前没有被另一个进程使用

openpty() 函数找到一个可用的伪终端并返回 amaster 和 aslave 中主从的文件描述符。如果 name 不为 NULL,在 name 中返回从站的文件名。如果 termp 不为 NULL,slave 的终端参数将被设置为 术语中的值。如果winp不为NULL,slave的窗口大小 将设置为 winp 中的值。

这是什么意思?

您将收到所有必要的数据来操作伪术语、它的从属部分、它的主控部分和它的文件名。

伪术语通过实现终端输入/输出语义来模拟真实终端。它们在许多情况下使用,模拟连接的终端(例如,考虑通过 ssh 登录到远程系统时会发生什么)或控制某些交互式程序(例如,设计一个必须运行 shell 的 GUI 终端)。

我觉得这个问题很愚蠢(“只是 RTFM!”)

当然不是那种情况,终端和会话管理在开始时是非常棘手的事情。

-----编辑-----

真正的终端。它以前如何?在早期(不是很早,恐龙的世界更可怕)连接到一个系统时,我们使用终端、一个带键盘的简单设备、一个屏幕(没有图形)和一些小硬件和软件来管理一条线路已插入其中一个计算机的插头。因此,在操作系统中需要管理来自终端的所有输入/输出:在需要时将键入的字符回显到屏幕,缓冲输入/输出以便能够删除命令行上的字符等。操作系统部分是通过管理的终端驱动程序表示为像/dev/ttyXXX 这样的设备。一台这样的物理设备,一台操作系统终端设备。

如今,此类物理设备已不存在,除非在某些特殊情况下,例如服务器控制台(我的意思是直接连接到机器的设备!或者当所有这些奇怪消息以文本模式出现时,您的屏幕在启动时, ETC)。我们现在通过许多不同的虚拟事物连接到操作系统(今天的计算机世界是关于虚拟),例如模拟物理终端行为的 GUI 终端。然后旧物理线的两端部分用伪终端表示,伪终端分为两部分:主设备和从设备。 slave 代表应用程序看到的操作系统中的旧部分。 master 代表旧物理线路的插头,因此它现在作为一个软件提供,让您编写一个能够对该 虚拟线路进行输入/输出控制的应用程序 并且表现得像一个真正的终端

【讨论】:

  • 另一个有趣的点是今天的许多程序员从未使用过“真正的终端”。我什至不确定这句话是否有意义,尽管串行端口仍然存在并且嵌入式编程仍然使用它们。 Linux 控制台是“真正的终端”吗? (我想知道有多少人使用 Linux 控制台。)
  • 您应该在此答案中添加一些关于您的 cmets 的历史背景的内容。它有助于像我这样的新手知道这里的文档措辞是由于历史原因而不是深刻的原因。
  • @rici 是的 Linux 控制台,我的意思不是 GUI 控制台,例如启动时的控制台,是一个真正的终端。是的,这些概念很难处理......
  • @Praxeolitic 添加了一些关于终端的历史信息。
猜你喜欢
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-28
相关资源
最近更新 更多