我发现这篇很棒的文本解释了很多关于TTY设备的内容。它关注的是TTY设备和shell(及其派生的作业)之间的关系。但它很少提及终端模拟器和TTY设备之间的关系;现在我想知道。我在谷歌上搜索了一下,但找不到答案。。。
1) 终端仿真器负责什么样的输入逻辑?它只是将每个字符代码(通过窗口事件接收)发送到TTY设备,还是在传输到TTY之前/期间进行更复杂的处理?这些字符代码是如何发送到TTY设备的?通过文件?
2) 前台进程将write()
调用到TTY设备文件(也称为stdout
/stderr
)后,会发生什么?这些数据如何到达终端模拟器进程,以便进行渲染?还是通过文件?
3) 终端仿真器是否负责"分配"TTY设备?TTY设备可以由内核"动态"创建,或者内核可以管理的可用TTY设备数量有限吗?
首先,回答自己什么是终端。
历史上,终端设备,其中一些哑设备将输出字符从程序转换为某些输出设备(打印机或阴极射线管)中的可见图形,并通过串行线将输入字符发送到程序(在键盘上本地生成)。
从这个角度来看,终端模拟器是一种软件应用程序,通常在未被设计为充当终端设备的计算机上运行,以使其表现为终端设备。通常,这意味着它将接收来自串行线的输入以输出给用户(例如,在屏幕上的特定窗口中),并处理该窗口上的用户输入,并将其发送到远程计算机,以便在那里运行的程序中进行处理。
相比之下,tty行是用于发送和接收字符的串行行。在UNIX中,它们曾经有一个通用的驱动程序,对从实际终端接收到的字符进行一些处理。例如,unix驱动程序收集所有字符,允许通过使用退格键进行一些编辑,并且只有在用户(终端)发送RETURN键后,计算机上运行的程序才能使用这些数据。
前段时间,需要有虚拟终端设备(后面没有实际终端,而是另一个程序的设备),需要运行几个程序来编程连接设备(例如,不将密码字符回显到终端,或逐字符输入,而不是逐行输入),并允许虚拟TTY程序对这些程序执行操作。
虚拟终端设备成对出现,终端模拟程序获得虚拟终端的主端,在从端运行实际程序(例如,允许基于windows的伪终端的登录外壳)
现在是您问题的答案:
1) 终端输入逻辑在从设备的虚拟终端驱动器上进行管理,就好像在其上运行的程序完全控制字符映射或行/原始输入一样。顺便说一句,连接到主端的程序只获得原始字符,没有任何解释,因此它可以发送一个Control-C字符来中断在从端运行的程序。
2) 当在从端运行的程序进行写入时,该写入通过tty驱动程序,使得行规则的所有假设(例如在终端烹饪操作模式的情况下在任何LF字符之前添加CR字符以形成CRLF序列)在主端运行的程序将在输入时接收原始字符(甚至例如由程序编写的Ctrl-C),tty设备转换输入字符(Ctrl-C的情况),并将正确的信号发送到连接到该伪终端的进程组。
3) 从历史上看,终端是以设备对的形式出现的(作为一种特定类型的终端字符设备驱动程序),因此,它们有带有主/次数字对的inode。这将它们的数量限制为正确配置的管理值。例如,如今,linux允许动态分配设备,从而可以动态分配设备对。但最大数量仍然是有界的(出于效率和实现的原因)