伪终端 为何物

194 阅读14分钟

前言

终端 是我们习焉不察,日用而不知的一种工具,
如果去问wiki,百科如是说:

image.png

image.png

如果去问一个 Linux 爱好者:“Linux 中最神秘的东西是什么?” 我相信回答​“终端”​的人一定不在少数。黑洞洞的窗口,像音符一样跳动的命令与输出,适时闪烁的光标,无一不弥漫着古老而又神秘的气息!

终端(terminal)

image.png

  • 物理终端:终端是一种和计算机交互的硬件设备(早期是硬件,如今已是软件),用于处理输入和输出。最早的硬件终端是电传打印机(​teleprinter​、​teletypewriter​、​teletype​、TTY 指的都是电传打印机),显示内容需要打印到纸上,这也是为什么在编程中向终端打印使用 print 而不是 display 的原因,使用屏幕显示内容还要等到 CRT(阴极射线管)设备的出现。这些硬件终端与计算机通过串口直连,或者通过调制解调器远程连接,不过这种连接方式的距离和终端数量都很有限。
  • 虚拟终端:在物理机上使用软件虚拟出来的终端。即,现代意义上的终端已经几乎全部虚拟化、软件化了,Unix/Linux 系统可以通过Ctrl+Alt+Fn 组合键切换虚拟终端(virtual terminal),现代 Linux 系统通常在其中一个终端启动图形界面,Unix/Linux 在功能键上启动的这些终端即是虚拟终端/dev/ttyn

控制台(Console)

image.png

控制台其实是一种终端,大多时候和计算机长在一起,不一定要有屏幕,摇杆、按钮也可称为控制台,只要是能控制计算机的都属于控制台。 现代个人计算机已经没有控制台了,终端和控制台已经虚拟化,且大多时候混用这两概念也没有问题,都是表达用于处理计算机输入与输出的含义。 进程对于终端设备的读写由终端驱动处理,终端驱动维护着两个队列:​输入队列和输出队列​,键盘的输入会进入输入队列,最后被进程读取;进程的输出会进入输出队列,由终端显示。如果该终端设备的回显功能被打开,进入输入队列的内容会同时发送到输出队列,由终端设备显示在屏幕上,这就是你敲击键盘后终端中显示内容的原因。

Shell 是用户空间的应用程序,连接到终端。Shell 通常由 terminal fork 出来,是 terminal 的子进程。
Shell 不处理键盘事件,也不负责字符的显示(这些是由 terminal 处理)。
Shell 负责提示用户输入,解释执行用户输入的字符,然后处理来自底层操作系统的输出。
常见的 Shell 有 Bash、Zsh 和 sh。

伪终端(pseudo terminal, pty)

终端模拟器(terminal emulator)通常是指运行在内核的模块,而运行在用户态的终端模拟程序则被称为伪终端

image.png

上图中:伪终端有两种形式:
(1)在图形界面下打开的命令行窗口;
(2)通过SSH或者Telnet远程连接Linux系统;

伪终端 主设备和从设备组成了一个双向管道,连接了两个进程。一端称为 master(主),另一端称为 slave(从)。 从端看上去和真实的终端一样,能够处理所有的终端 I/O 函数。这是由于连接从设备的进程通常是 shell,所以对 shell 来讲伪终端从设备表现的就像原来的终端设备,终端驱动也是和从设备相连,进程对终端的读写都发往从设备。

image.png

因此,伪终端其实是 IPC(进程间通信)的一种,它有一对主从设备, 也叫伪终端对,分别连接着两个进程:

image.png

图中:(pseudo-terminal slave, pts)是pty的实现方法,与(pseudo-terminal master, ptmx)配合实现伪终端(pseudo terminal, pty)。line discipline 负责转换特殊字符(如退格、擦除字、清空行),并将收到的内容回传给电传打字机,以便用户可以看到输入的内容。line discipline 还负责对字符进行缓冲,当按下回车键时,缓冲的数据被传递给与 TTY 相关的前台用户进程。用户可以并行的执行几个进程,但每次只与一个进程交互,其他进程在后台工作。

远程终端 SSH 是一种伪终端 PTY,它允许本地用户安全地通过网络连接到远程机器上登录 shell。这时候远程主机上的 ssh server 就是一个伪终端 PTY,它同样持有 PTY master,但 ssh server 不再监听键盘事件,以及在屏幕上绘制输出结果,而是通过 TCP 连接,向 ssh client 发送或接收字符。

image.png

客户端的输入通过网络抵达 SSH server,SSH server 发往伪终端主设备,最终变为 shell 进程的标准输入;同样,由 shell 产生的输出经过伪终端主设备抵达 SSH server,再经 SSH server 发送到网络,最终被 ssh client 接收。

image.png

因此,伪终端是 内核 和 外界 用于交互信息的一种终端模拟程序

Linux中的设备文件 pts、dev、tty4pp

在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件,一般有以下几种:

串行端口终端(/dev/ttySn):串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。

image.png

伪终端(/dev/pty/):伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty/m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。
控制终端(/dev/tty):如果当前进程有控制终端(Controlling Terminal),那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于登录的shell,/dev/tty就是使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。
控制台终端(/dev/ttyn, /dev/console)。

关于终端的哲学呓语 - 世界是我的表象

世界是我的表象​。这句话出自叔本华的哲学名著《作为意志和表象的世界》,没错,我要用我肤浅的不能再肤浅的哲学知识做一些哲学上的附会,如果你对哲学没有兴趣,阅读至此就可以离开了,你并不会因此错过什么。

我们的认知能力是一副天然的有色眼镜,我们看到的世界都是有色眼镜呈现给我们的,在叔本华哲学里有个很重要的概念:摩耶之幕。简单讲,就是一张超级巨大的,囊括天地的,但普通人察觉不到的帷幕。这个概念来自古印度的宗教经典,讲出了一个耸人听闻的真理:你以为山河大地、日月星辰都是真实存在的吗?那你就错了,你被骗了!其实我们看到的全部宇宙都只是婆楼那神施展出来的幻术,全是假的,一旦婆楼那神收回神通,宇宙就消失了。

其背后的真实世界是我们靠理性永远认识不到的。真实的世界,或者说物体在真实世界中的样子,康德谓之物自体,叔本华谓之意志,柏拉图会说那是理念。

为了把问题简化,你可以想象一下自己的所有感官都不存在,只剩下一双眼睛,只存在视觉能力,然后你一辈子都戴着一副红色的眼镜,镜片是半球形的凸面镜,所以你看到的万事万物不但都是红色的,还都是变形的。变形当然是有规律的,在怎样的角度,怎样的距离,会发生怎样的变形,你逐渐都能研究清楚,形成一套科学认知体系。当我站在你面前,如果你采取的是平视的角度,会看到一个红色的枣核形胖子,俯视的话,看到的是红色的墩子形胖子,仰视的话,看到的是一个红色的梨形胖子。我真的长成这样吗?真的会变形吗?当然不是,但你永远看不到我真实的样子,更重要的是,你永远都不该妄想能看到我真实的样子。你戴的眼镜决定了你的视觉模式,这是改变不了的。在你眼里,我永远都是一个红色的、会变形的胖子。

真实的我,还包括真实的其他东西,康德称之为“物自体”,属于本体世界,而你看到的我,包括你看到的其他东西,都是物自体通过你的有色眼镜呈现给你的视觉图像,康德称之为“现象”,也可以叫“表象”。

如果将计算机比作一个世界,终端呈现的就是世界的表象。如果终端中的字符有生命,他们能感官的一切都是表象,就连普通人对计算机的认知也是通过终端或者显示器的呈现,也同样是计算机世界的表象,而内行当然知道这些丰富表象的本质仅仅是高低电平的错落。

现实世界只是现象世界,叔本华认为我们被“意志”支配,欲无止境,人生充满痛苦,所以聪明人都应该舍现象而求本体,舍刹那而求永恒。而完美且永恒的世界就是本体世界,就是理念的世界。

康德认为时间和空间都是我们的主管感受,当你戴着时间和空间的眼镜,你看到的万事万物都会表现为时间上的相继和空间上的相距,这是认知能力带给我们的关系和限制,我们无法摆脱,也就是无法进入理念的世界。

但叔本华认为,我们可以短暂的进入到理念的世界,那是一种短暂的迷狂状态,霎那间仿佛时间和空间都消失了,你忘记了一切,现实生活里的各种柴米油盐都不复存在了,等回过神来的时候,突然会涌起一种深深的失落,叔本华称之为“审美直观”和“自失”。

这是美学里的概念,是的,叔本华认为人是可以通过审美进入自失状态的,这种迷狂的,自失的状态就是理念世界。

任何人只要在现实生活里窥见了理念世界,都只想留在那里,再也不愿意回来。遗憾的是我们只能短暂的进入理念世界,而通过对文学艺术的审美,就可以使人进入这种状态。你可能会问:我为什么要进入这种状态?朴实的回答是你由此获得了审美享受,叔本华会说你摆脱了现实的世界的悲剧,进入了理念世界,获得了自由!

那么,文学艺术作品为何能产生审美直观呢?

所谓的理念,也叫理型、理想、理想型(此处并不是我们日常语言中的“理想”),简单讲就是抽象的、一般性的概念,在哲学术语里通常称为“共相”。比如我们在现实世界里看到这朵花和那朵花,看到成千上万朵花,每一朵花都是具体的、特殊的,这叫“殊相”。但我们会从无数具体的殊相的花里抽取共同特征,形成一个“花”的概念,这就是共相。我们用“花”这个共相来整合这朵花和那朵花的殊相。诗人在迷狂状态下可以写出好诗,画家在迷狂状态下可以画出好画,因为他们创作出来的作品是直接对理念的写照,写出了抽象,写出了共性。那么,在我们欣赏这些艺术杰作的时候,同样能进入迷狂状态,直接看到理念。

没错,那个既完美又永恒的世界是一个精神世界!

我早年一直想弄明白文学艺术的意义,为什么提到文明,我们总会首先联想到文学艺术,为什么不能是科学技术呢?你看它不像科学来帮助我们发现真理,改善生活,乃至改变人类进程;也不像社会学和政治学关心我们真正的生活秩序问题;更不像哲学在思想上指导人类前行。那文学艺术的意义到底是什么呢?就连《三体》中地球被降维打击时,为了让文明可以展现在二维花卷上,主人公也是将一些诸如《诗经》、《清明上河图》、《蒙娜丽莎》、《星空》等文学艺术作品呈现出来,为什么就不能展现半导体电路板、火箭设计图纸呢?

前面的长篇大论就是我在哲学上找到的答案,也是我最想分享给你的。我确实有过叔本华所谓的自失状态,我早年读《草样年华》,近些年读《三体》都曾浓烈的感受到茫然的自失,后来我的兴趣逐渐转向了历史和哲学,这种体会也只有在研究计算机技术的时候才能多少体会到一点了,而这才是我真正想要讲的内容。

康德说我们永远无法搞清楚物自体的世界,所以只应研究表象世界,不要研究物自体世界;叔本华认为我们虽然无法搞清物自体,但可以认识到,推测它的一些特征,也就是所谓的意志。文学艺术需要写出物自体的特征,也就是理念,才能将人带入审美直观,但计算机的世界不同于文学艺术,它不需要通过艺术手段抽象世界的共性以达到理念的世界,它就是世界,一个将表象和实质都呈现给你的世界,但你需要付出一点理性才能将表象和实质联系起来。

我们处在现实世界之中,只能通过文学艺术达到审美直观,而我们在计算机的世界之外,“我们”创造了这个世界,可以认为计算机世界是对真实世界的拙劣模仿,设计者扮演了类似上帝的角色。在这个拙劣的世界里,我们既能看到表象,又能认识到物自体,我们完全可以把自己想象成计算机世界的表象,然后在现实世界运用理性认识到表象背后的物自体,就像是在看一幕戏剧,从开始到结尾,你既看得出角色的悲欢,又能体会到上帝创造万物时的理念,你无形中靠近了上帝,在遐想中脱离了计算机世界的时空束缚,达到了一种自失状态。

这无关荣耀,只关乎自由!

文章撰写不易,转载请标明出处!
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作分享的最大动力,谢谢!

参考文献

1.终端闲思录
2.理解Linux 终端、终端模拟器和伪终端
3.什么是终端、终端模拟器和伪终端

可以肯定的是学海无涯,这篇文章也会随着对 Linux 的深入学习而持续更新
欢迎各位在评论区留言进行探讨交流。