Tim Asked: 2018-05-26 14:37:32 +0800 CST2018-05-26 14:37:32 +0800 CST 2018-05-26 14:37:32 +0800 CST 主设备看起来就像驱动程序的标准终端吗? 772 从 Linux 编程接口 伪终端的关键在于从设备看起来就像一个标准终端。所有可以应用于终端设备的操作也可以应用于伪终端从设备。其中一些操作对伪终端没有意义(例如,设置终端线速度或奇偶校验),但这没关系,因为伪终端从机默默地忽略它们。 从设备对面向终端的程序来说就像一个标准终端。此外,对于面向终端的程序的进程,它就像一个控制终端。 主设备看起来就像驱动程序的标准终端吗?如果是,像控制终端一样?如果不是,类似于设备文件或常规文件,但不一定是终端的设备文件? 谢谢。 pty 2 个回答 Voted Best Answer JdeBP 2018-05-27T03:14:24+08:002018-05-27T03:14:24+08:00 主设备看起来像一个终端设备文件,具有可通过tcgetattr()/ tcsetattr()/&c 访问的线路规程。和一个成功的结果isatty()。实际上它和从设备是同一个线规实例,这就是主端程序将窗口大小变化等信息传递给从端程序的方式。这也是主端程序如何通过将线路速度设置为零来发出(模拟的)调制解调器挂断信号的方式,从而触发线路规程的挂断机制。(因此文中关于线速度的说法是不正确的。存在线速度有意义的情况。) 区别在于读/写 I/O。读取的是字符序列,对于真正的终端,将通过实际的底层串行设备发送。写入的是字符序列,对于真正的终端,由实际的底层串行设备接收。换句话说:它是规范/非规范输入和输出处理的另一面。 这很复杂,即数据包模式和远程模式。后者早已被淘汰,即使在本世纪初,大多数操作系统也不存在,因此需要对 Daniel J. Bernstein 的旧 pty 工具进行修补。前者对于大多数任务并不是特别有用,因此我不会在这个答案中详细介绍它。 主设备一般不是主端进程运行的会话的控制终端。这将在概念上将类似于真实终端内部的东西放在错误的位置。此类会话的控制终端(如果有的话)是另一个终端。 对于诸如scriptNeoVIM :terminal、emacs 和ptybandage(如果不是管道的一部分)这样的程序将是这种情况,它们直接呈现到另一个终端设备并在由该终端设备控制的交互式会话中运行。 对于 SSH 服务器、GUI 终端仿真器、console-terminal-emulator来自 nosh 工具集ptyrun(正常使用)或单片帧缓冲区终端仿真器(如 zhcon)来说,情况并非如此。这些正在渲染到各种不同的 I/O 设备,从文件系统中的缓冲区和 FIFO(在console-terminal-emulator通过 TCP 套接字的情况下)到帧缓冲区和 HID 类设备,这些设备都不是终端。此外,console-terminal-emulatorSSH 服务器和帧缓冲终端仿真器通常在守护进程上下文中调用,当然会话开始时没有控制终端。 请注意,该图不是确定的。主端进程不一定会分叉从端进程。以nosh-toolset用户空间虚拟终端为例,slave端进程是普通ttylogin@*服务,由服务管理器fork出来,master端的emulator进程与主端的login session进程没有直接的进程关系奴隶一方。但这超出了这个答案的范围。 进一步阅读 https://unix.stackexchange.com/a/177209/5132 https://unix.stackexchange.com/a/249801/5132 乔纳森·德博因·波拉德 (2018)。“用户空间虚拟终端”。 小吃指南。1.38。点心。JdeBP 的软件。 乔纳森·德博因·波拉德 (2018)。快速浏览用户空间虚拟终端 nosh。JdeBP 的软件。 stolenmoment 2018-05-27T01:35:34+08:002018-05-27T01:35:34+08:00 主设备看起来大多像管道。您可以像管道一样读取和写入它的文件描述符,大小适合您。您将获得简短的读取,因此请始终检查 read(2) 返回的内容。
主设备看起来像一个终端设备文件,具有可通过
tcgetattr()
/tcsetattr()
/&c 访问的线路规程。和一个成功的结果isatty()
。实际上它和从设备是同一个线规实例,这就是主端程序将窗口大小变化等信息传递给从端程序的方式。这也是主端程序如何通过将线路速度设置为零来发出(模拟的)调制解调器挂断信号的方式,从而触发线路规程的挂断机制。(因此文中关于线速度的说法是不正确的。存在线速度有意义的情况。)区别在于读/写 I/O。读取的是字符序列,对于真正的终端,将通过实际的底层串行设备发送。写入的是字符序列,对于真正的终端,由实际的底层串行设备接收。换句话说:它是规范/非规范输入和输出处理的另一面。
这很复杂,即数据包模式和远程模式。后者早已被淘汰,即使在本世纪初,大多数操作系统也不存在,因此需要对 Daniel J. Bernstein 的旧 pty 工具进行修补。前者对于大多数任务并不是特别有用,因此我不会在这个答案中详细介绍它。
主设备一般不是主端进程运行的会话的控制终端。这将在概念上将类似于真实终端内部的东西放在错误的位置。此类会话的控制终端(如果有的话)是另一个终端。
对于诸如
script
NeoVIM:terminal
、emacs 和ptybandage
(如果不是管道的一部分)这样的程序将是这种情况,它们直接呈现到另一个终端设备并在由该终端设备控制的交互式会话中运行。对于 SSH 服务器、GUI 终端仿真器、
console-terminal-emulator
来自 nosh 工具集ptyrun
(正常使用)或单片帧缓冲区终端仿真器(如 zhcon)来说,情况并非如此。这些正在渲染到各种不同的 I/O 设备,从文件系统中的缓冲区和 FIFO(在console-terminal-emulator
通过 TCP 套接字的情况下)到帧缓冲区和 HID 类设备,这些设备都不是终端。此外,console-terminal-emulator
SSH 服务器和帧缓冲终端仿真器通常在守护进程上下文中调用,当然会话开始时没有控制终端。请注意,该图不是确定的。主端进程不一定会分叉从端进程。以nosh-toolset用户空间虚拟终端为例,slave端进程是普通
ttylogin@*
服务,由服务管理器fork出来,master端的emulator进程与主端的login session进程没有直接的进程关系奴隶一方。但这超出了这个答案的范围。进一步阅读
主设备看起来大多像管道。您可以像管道一样读取和写入它的文件描述符,大小适合您。您将获得简短的读取,因此请始终检查 read(2) 返回的内容。