【发布时间】: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/实现,这里的文档会非常尴尬