我最近发布了一个有关终端的问题,这似乎值得单独提出一个问题。如果终端这将是与终端同义,只是设备驱动程序/设备文件本身,什么为终端提供了实际的接口,它叫什么?我并不是指任何方式的图形用户界面,而是指打印和读取文本的实际区域(无论是在虚拟终端中还是可能在伪终端中)。 这是否被视为终端的一部分?这些是否以某种方式由内核控制?基本上,如果有人想编写一个控制台程序,例如 gnome-terminal (甚至虚拟终端),是否有某种基于内核的小部件/界面来接受输入和输出?基本上,tty(本身即/dev/tty)只是一个文件,或者它是否包含显示输出(以各种颜色和粗细)并从键盘读取所需的代码。
这是正确的吗:我在这里找到的“终端”、“shell”、“tty”和“控制台”之间的确切区别是什么?也就是说 tty 与终端同义。这就是让我困惑的地方。我认为要模拟终端或提供终端,需要终端驱动程序(tty)以及终端显示和交互部分(类似于xterm)。那么 tty 本身只是一个输入和输出的驱动程序,而显示和读取来自 tty 的文本的东西类似于 xterm 吗?将“/dev/tty 终端驱动程序”称为“/dev/tty 终端驱动程序”也是正确的吗?另外,当我说 xterm 时,我指的是 $TERM var 的值。
另一种想法(让我知道这一点):tty 文件是终端或当今的终端仿真器与 shell 之间的连接的同义词。现在它们都在同一个盒子里,但原始终端将是今天的终端仿真器(显然),但 tty 或 tty 文件将有点像终端和 shell/操作系统之间的串行连接。如今,在我看来,终端模拟器是一个用于与 /dev/tty... 文件交互的环境/窗口,而 shell 位于另一侧?那么写入 /dev/tty 文件就像写入或读取串行端口一样吗?我假设这不完全是如何工作的,任何帮助将不胜感激:-(。
答案1
最初,“tty”有两个定义:硬件(现在是模拟器)和驱动程序(通过 /dev/pty* 或 /dev/tty* 连接)。
硬件/模拟器负责:
- 获取数据流并呈现它;这包括解释“向左移动光标”、“闪烁光标”、“清屏”等控制序列,尽管这些控制序列在制造商之间通常有所不同。
- 发送用户键入的键的键码;其中大部分是标准 ASCII 字符,但某些终端甚至为标准按键发送专有按键代码。
“tty”驱动程序负责:
- 以原始或规范模式管理缓冲;例如,缓冲一行字符直到Enter按下。
- 管理控制流;例如能够使用 / 停止/Cntl-s继续Cntl-q。
- 如果适用,将专有键码转换为标准 ASCII。
- 拦截某些控制字符(如Cntl-c和Backspace)并对其进行适当处理(在 a 上发送 SIGINTCntl-c或在Cntl-d.
- 例如,如果
echo
关闭字符的规范显示,则不会将反馈(键入的字符)发送回终端。
terminfo 和 termcap 数据库管理应为操作发送哪些终端控制字符(例如“清屏”)。这些控制序列不是由驱动程序解释的,而是由硬件/仿真器解释的。
答案2
我认为这个链接涵盖了它。阅读全文,太棒了:-)
http://www.linusakesson.net/programming/tty/index.php-- 它解释了终端 (TTY) 如何由终端驱动程序(有助于控制会话)和线路规则(如果设置的话,可以控制特定线路编辑)组成。如果它设置为原始模式(行规则),它可以被读取行库之类的东西覆盖。终端仿真器在某种程度上控制键盘输入和显示的处理。 /dev下的终端设备文件可用于操作线路规则和驱动程序。我是这样看的。
答案3
对于控制台 tty ( /dev/ttyX ),内核驱动程序负责显示输出。对于 gnome-terminal,它负责显示输出。内核只是向 gnome-terminal 提供主/从 psuedo 终端对的主端,以便将 psuedo 终端的输出发送到 gnome-terminal 进行显示,并且 gnome-terminal 可以将输入发送到附加到它的进程的终端读书。