1970 年代,我们有了硬件终端 CUI。
现在,在我的 Linux 盒子中,我看到七个终端仿真器,其中 GUI 占用了第 7 个终端仿真器 (Ctrl+Alt+F7)。
例如,这是我的第一个终端(Ctrl+Alt+F1)模拟器
$ tty
/dev/tty0
>cat
在用户空间中按ENTER 键时,cat
进程等待stdin
接收来自/dev/tty0
文件的输入。我无法/dev/tty0
使用任何编辑器查看文件。
进程stdin
和都在处理文件。stdout
cat
/dev/tty0
问题:
使用某些编辑器,此终端文件可以/dev/tty0
在用户空间中访问吗?
答案1
您一直在访问终端文件。但这并不像您想象的那样。
当您写入磁盘文件,然后从中读取时,您读取的就是您写入的。对于终端等特殊文件来说,情况并非如此。文件是可以写入和读取的东西;写入内容和读取内容之间的联系取决于文件的性质。对于字符设备文件,通常根本没有链接。
终端文件连接两个扮演不同角色的实体:终端本身和想要与用户交互的应用程序。终端可以是由内核表示的硬件,也可以是终端仿真器(它是一个进程)。当应用程序写入数据时,终端开始读取数据(并且通常以某种方式将其显示给用户);当应用程序读取数据时,数据来自终端(通常是用户输入的)。
在您的情况下,应用程序依次是 shell、cat、编辑器等。编辑器可能会尝试从终端读取数据,但如果是这样,它会等待您的输入,并且它可能会或可能不会对输入结束做出正确反应(您可以通过在行首按 Ctrl+D 来发出信号)。再说一次,从终端读取不会给你带来以前的东西输出到航站楼。
对于控制台,写入终端的数据将绘制在屏幕上。使用 Linux 控制台,/dev/tty1
可以从设备读回显示的文本/dev/vcs1
只要它保持可显示(因此您只能获得屏幕上显示的内容,加上向后滚动仍可用的内容;向后滚动无法到达的任何内容都将永远丢失)。
请注意,这是 Linux 终端接口提供的功能。终端可以简单地绘制像素并忘记文本。大多数终端仿真器不提供任何类似的功能。
¹实际上,大多数文件都是这样的,但不是全部。目录无法通过普通接口写入,并且在许多 UNIX 变体上也无法读取。有些设备不支持读取或写入,仅支持ioctl
.
答案2
是的,但是终端文件不是常规文件。
如果列出终端文件的扩展属性,您将看到:
$ ls /dev/tty1 -lah
crw--w---- 1 root tty 4, 0 Apr 6 13:07 /dev/tty1
注意权限部分的第一个字符是字母“c”,这表明该文件是一个字符特殊设备。相反,常规文件中包含“-”,目录为“d”,块特殊设备为“b”,符号链接为“l”,unix 域套接字为“s”。
需要注意的是,在像 Linux 这样的 Unix 系统中,文件系统实际上更像是与内核对象交互的命名空间,您可以在其中为各种内核对象命名,以便系统的各个部分可以明确地引用它们。这些内核对象不仅仅是由持久存储支持的常规文件,而且还包括硬件设备或套接字等。
字符特殊设备是一个内核对象,通过读取和写入字符流与用户空间交互,它们可以通过执行以下操作来访问:read()
和write()
系统调用。
例如,在我的机器上使用 Ctrl+Alt+F1(在我的机器上是 /dev/tty1,而不是 tty0),我可以使用使用系统调用的程序读取输入到虚拟控制台的任何内容,read()
例如cat
:
- 在图形模拟器中,
sudo cat /dev/tty1
- 使用 Ctrl+Alt+F1 切换到虚拟控制台模拟器
- 在虚拟控制台模拟器中输入一些内容
- 使用 Ctrl+Alt+F7 切换回图形 UI
- 在图形模拟器中,我会看到在虚拟控制台模拟器中输入的任何内容作为输出
cat
相反,我还可以使用使用write()
系统调用的程序在虚拟控制台中显示字符,例如tee
:
- 在图形模拟器中,
echo "hello world" | sudo tee /dev/tty1
- 使用 Ctrl+Alt+F1 切换到虚拟控制台模拟器
- 在虚拟控制台模拟器中,我会看到“hello world”
大多数常规文本编辑器将拒绝实际打开非常规特殊文件,因为它们被编程为检查文件类型并拒绝编辑非常规文件。这是为了防止“意外”,因为在常规文本编辑器中编辑特殊设备没有什么意义。此外,大多数常规文本编辑器实际上并不只是调用write()
现有文件,而是写入新文件和rename()
交换文件以替换旧文件。即使您有支持就地写入的文本编辑器,它们通常也会首先尝试截断文件,这当然在特殊字符设备中不受支持。
答案3
1970 年代,我们有了硬件终端 CUI。
但在 70 年代没有人使用 CUI 这个术语。
现在,在我的 Linux 盒子中,我看到七个终端仿真器,其中 GUI 占用了第 7 个终端仿真器 (Ctrl+Alt+F7)。
这些终端仿真器在 80 年代就已经可用,而且还没有 GUI。
使用某些编辑器,这个终端文件 /dev/tty0 可以在用户空间访问吗?
这个问题没有意义。根据设计,所有文件都可以在用户空间中访问,这就是文件的全部要点,尤其是/dev
./dev/tty0
作为一种设备,它无法被编辑,因为它的“内容”本质上是短暂的。您从中读取的内容就是您最终在控制台中输入的内容,并且您在控制台上写入的内容将显示在屏幕上。
答案4
是的,您当然可以像 UNIX 中的任何设备一样将任何 TTY 作为文件进行访问。我会将这个问题标记为可能重复这答案很好地解释了在类似情况下如何做您所要求的事情。
总结一下这个答案的内容,您可以使用 echo 和 cat 与其他 TTY 进行交互,就像处理任何其他文件一样。打开文件时看不到任何内容的原因是像许多特殊文件一样,只有新数据可用。