在我的操作系统课上,教授提到有流和存储设备。我的意思是询问流设备。我也听说过术语character devices.
在Linux VM上,可以通过
proc
文件系统看到对应的终端设备:
$ ls -l /proc/$$/fd
total 0
lrwx------ ... ... ... 0 -> /dev/tty1
lrwx------ ... ... ... 1 -> /dev/tty1
lrwx------ ... ... ... 10 -> /dev/tty1
lrwx------ ... ... ... 2 -> /dev/tty1
看来stdin、stdout、stderr都指向同一个设备,
zsh
维护fd10
访问终端
我特别想知道终端是如何工作的,以及 shell 之类的程序如何与之交互,因为看起来像
cat
这样的程序在读取标准输入时只在 <Enter>
上接收输入。我发现奇怪的是,你也可以像标准输出一样写入标准输入,所以我想知道如何维护偏移量(为了它们之间的协调——因为它们似乎共享打开文件表中的一个条目),因为这些设备确实没有有效的lseek.
举个例子:
#include <unistd.h>
int main () {
write(STDIN_FILENO, "hello\n", 6);
return 0;
}
我的问题真的是:如果不是“存储”,是什么在管理您输入计算机并在屏幕上看到的数据?我问的是“流”设备的概念,以上是示例。
我还特别询问原始文件描述符和底层流设备,而不是
FILE*
提供的缓冲“流”。
一个例子是 UNIX
|
,我理解为具有写入偏移量和读取偏移量,它们以循环(有界)的方式更新;然而,这不是像 stdin 或 stdout 这样的标准流设备。