进一步阅读

进一步阅读

我想将 Linux 终端流式传输到我自己的程序,据我所知,这是通过打开 /dev/ptmx 启动一个新的 pts 来完成的,我已经对此进行了测试,这确实有效(它在/dev/pts)。但我不确定我应该如何实际读取和写入这个终端。直接写入 /dev/pts/(pts number) 我刚刚收到输入/输出错误。另外,我是否应该使用同一程序同时打开 /dev/ptmx 和 /dev/pts/(pts number) 。我应该先打开一个外壳吗?

我发现这些东西有点令人困惑,除了这个手册页之外我找不到太多信息http://man7.org/linux/man-pages/man4/pts.4.html

答案1

这类事情有两个不同的部分。

  1. 正如您所确定的,您打开伪终端的主端,这将创建一个可以打开的从端设备文件。库函数ptsname()允许主端具有打开文件描述符的东西来确定该设备名称。
  2. 同一或另一个程序在不同的进程中打开从属端,将其完全视为登录子系统对待真实和虚拟终端的方式:将该进程设置为会话领导者;将Slave侧设置为会话的控制端;并将标准输入、输出和错误设置为从属端的打开文件描述符。然后它会链式加载任何合适的交互式程序,其中确实可以是外壳。

在某些操作系统上,只有第一部分调用了grantpt()unlockpt()库函数后,第二部分才能继续。内核中的互锁会阻止从属端可打开,直到这些情况在主控端发生为止。

有趣的是,这些功能(来自 AT&T Unix System 5 Release 4)已被证明是不必要的。它们是由以下实现导致的:从属端设备是由错误的用户帐户和错误的权限创建的,或者甚至更老从属端设备是持久性字符设备节点(其权限和所有权从上次设置的内容开始保留)并且不是即时创建的实现,导致其他用户运行的攻击者程序在各种情况下都有机会获取信息访问终端。但如今,一些操作系统内核只是从一开始就为从属设备提供了适当的所有权和权限,从而允许这些功能本质上是无操作的。现在 FreeBSD 和 OpenBSD 都是这样工作的。不幸的是,尽管多年来内核开发人员多次提出过这样的说法,但 Linux 并不是这样的内核。

第二部分故意模糊说明这到底是什么不同的过程。常见的架构是主端进程fork()、调用ptsname()、打开从设备并关闭主端文件描述符。这就是pty-runnosh 工具集中所做的事情,人们可以用它来构建诸如ptybandage和 之类的工具ptyrun。这就是scriptGNU Screen、tmux 和 GUI 终端仿真器(例如 XTerm)的工作原理。

但这不是一个必要的事物。只要它知道要打开的文件名,从端进程就不需要是fork()主端进程的 ed 子进程。事实上,如果不是的话,它就消除了对有关主控侧或该终端特别是伪终端的知识的任何需要。

例如,在我的用户空间虚拟终端子系统中,运行的进程console-terminal-emulator创建一个符号链接,该符号链接具有指向从设备文件名的已知固定名称。完全独立的服务进程使用已知的固定名称来打开从端设备,而不需要知道内核每次碰巧使用的确切名称。这些服务进程的操作与附加到内核虚拟终端的类似服务进程相同,并且与附加到真实终端的服务进程基本相同。毕竟,伪终端的从属端被设计为像其他两种终端一样工作。/dev/pts/N

进一步阅读

相关内容