我试图在这里澄清我对终端的理解。
终端实际上是一个设备(键盘+显示器)。在 CLI 模式下,键盘输入直接进入 shell,并显示在监视器上。
同时,使用GUI模式时,必须打开终端仿真器程序才能与shell交互。键盘的输入进入终端仿真器程序,并显示在监视器上的终端仿真器窗口上。输入不会直接进入 shell。终端仿真器程序会将键盘的输入转发到 shell。终端仿真器程序使用伪终端与 shell 进行通信。
当您从启动直接进入 CLI 时,不涉及终端仿真器程序。
如果我的理解有什么不对的地方请评论并指正。
更新: 我回读了TTY 揭秘。我想我应该问的是文本终端(直接启动到文本模式)和GUI终端之间的区别,因为我认为终端=文本终端,终端模拟器=GUI终端,例如Gnome终端,这是错误的。从本次更新之前的回答来看,用户实际上也像在 GUI 模式下一样使用终端仿真器程序(用户空间)。我可以知道它是 TTY 程序吗,因为我在运行命令“ps aux”时发现了 TTY 进程。我从来不知道在文本模式下也涉及终端仿真器程序(不是指内核空间中的终端仿真器)。
更新2: 我读Linux控制台。据此,文本模式是控制台,而GUI模式的终端软件是终端仿真器。嗯,很有道理,和我之前的理解是一样的。然而,根据图解来自 TTY 揭秘,终端模拟器位于内核空间而不是用户空间。有趣的是,该图指的是文本模式。
答案1
这里有几个单独的术语需要独立定义:
终端:真正的键盘/显示器接口,如 VT100:https://en.wikipedia.org/wiki/VT100
终端模拟器(TTY):模拟终端,提供输入和输出。在大多数 Linux 发行版中按 ctrl+alt+F2,您就会进入其中。在终端中输入“w”,您将看到 w 命令由“tty”运行。
伪终端(PTY):主/从对 (ptmx),其中其他一些软件(如 ssh 或 GUI 终端)通过从属 (pts) 提供类似终端的界面。http://linux.die.net/man/4/ptmx 在 GUI 终端中输入“w”,您将看到列出的来自 pts 的 w 命令。
壳:在登录时运行的命令行解释器,并解释您的输入。 bash/zsh 就是这样的例子。
但是,请记住,这些术语在对话中都可以互换。当有人提到“终端”、“终端模拟器”、“控制台”、“命令行”或“shell”时,除非上下文另有说明,否则他们可能更笼统地指的是:
“我用它来控制一些计算机的基于文本的东西。”
编辑问题更新
请参阅下面的所有与 pts 或 pty 匹配的进程:
root@localhost tests]# ps fauxww | grep -P [pt]t[ys]
root 2604 2.3 0.8 50728 34576 tty1 Ss+ 07:09 1:15 \_ /usr/bin/Xorg :0 -br -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-VRHaoJ/database -nolisten tcp vt1
root 2569 0.0 0.0 2008 500 tty2 Ss+ 07:09 0:00 /sbin/mingetty /dev/tty2
root 2571 0.0 0.0 2008 500 tty3 Ss+ 07:09 0:00 /sbin/mingetty /dev/tty3
root 2573 0.0 0.0 2008 504 tty4 Ss+ 07:09 0:00 /sbin/mingetty /dev/tty4
root 2575 0.0 0.0 2008 500 tty5 Ss+ 07:09 0:00 /sbin/mingetty /dev/tty5
root 2577 0.0 0.0 2008 504 tty6 Ss+ 07:09 0:00 /sbin/mingetty /dev/tty6
sin 3374 0.2 0.7 90668 28564 ? Sl 07:13 0:09 /usr/bin/python /usr/bin/terminator <<< Added this parent of 3377 manually to see the pts source
sin 3377 0.0 0.0 2076 620 ? S 07:13 0:00 \_ gnome-pty-helper
sin 3378 0.0 0.0 5236 1712 pts/0 Ss 07:13 0:00 \_ /bin/bash
root 4054 0.0 0.0 5124 1676 pts/0 S 07:23 0:00 | \_ bash
root 5034 0.0 0.0 5056 1092 pts/0 R+ 08:03 0:00 | \_ ps fauxww
root 5035 0.0 0.0 4416 740 pts/0 S+ 08:03 0:00 | \_ grep -P [pt]t[ys]
sin 4154 0.0 0.0 5236 1708 pts/1 Ss 07:23 0:00 \_ /bin/bash
sin 4485 0.0 0.0 7252 3500 pts/1 S+ 07:41 0:00 \_ python
您将看到 pts 和 tty 相关进程。您假设因为您在 ps 中看到 tty,所以这就是您的 GUI 终端正在使用的东西,但事实并非如此。在这种情况下,mingetty TTY 进程是我可以通过 ctrl+shift+F2-6 使用的所有进程,而 pty 是与我的 GUI 终端进程相关的从属进程。为了确定这一点,请检查 GUI 终端进程的 lsof:
[root@localhost tests]# ps fauxww | grep terminator
sin 3374 0.2 0.7 90668 28564 ? Sl 07:13 0:08 /usr/bin/python /usr/bin/terminator
[root@localhost tests]# lsof -p 3374 | grep '[pt]t[ys]'
/usr/bin/ 3374 sin 17u CHR 136,0 0t0 3 /dev/pts/0
/usr/bin/ 3374 sin 25u CHR 136,1 0t0 4 /dev/pts/1
当您启动进入文本模式时,您将进入 TTY,就像在桌面上按 ctrl+alt+f2 一样。当您使用 SSH/GUI 终端时,您使用的是伪终端。
答案2
(显示)终端是具有键盘和显示器并与主机通信的硬件。终端本身就是一台小型计算机;嵌入式系统。
终端仿真器是在通用机器上运行的软件,它实现某些终端的行为。
终端模拟器并不都是图形化的。它们可以基于文本显示模式。 Linux 内核中的控制台就是一个例子。
终端仿真器也可以使用终端仿真本身。 GNU Screen 程序就是一个例子。它需要一个终端,但为在其下运行的程序提供终端仿真。
终端仿真器可以在主机中运行,以便提供虚拟终端来访问该主机本身。在主机上运行的软件将同一台主机视为附加的远程终端。但终端模拟器也可以用来简单地使用计算机作为访问某些远程主机的终端。例如,使用 PC 上 Windows 下运行的 IBM 3270 模拟器来访问大型机。它是一个模拟器,因为您使用的是 Windows 下的一个软件,而不是桌面上实际的 3270。但您并没有使用它来访问 Windows 命令行。这种终端仿真器的另一个例子是串行通信包,如 Minicom、超级终端等。此外,还有流行的 PuTTY SSH 客户端。