在Unix中,“一切都是字节流”是什么意思?

在Unix中,“一切都是字节流”是什么意思?

我是 Linux 的新手,在探索文件系统时 - 我经常遇到这个短语“一切都是文件“。我确实看到了这个问题的答案这里但我仍然无法理解这个概念。在答案中提到正是“一切都是字节流

我不明白显示器/键盘等表示为“字节流”的含义。有人可以帮我想象一下吗?

答案1

可以说,“一切都是文件”是口号。如果你愿意的话,一个模因。这并不完全正确。

显然,硬件设备并不是像hello.txtext4 文件系统上的实际文件那样。其中许多甚至与存储设备没有任何关系。

但即使不是一切都是文件,很多事情都可以访问就像它们是文件,至少在某种程度上是文件。也就是说,它们在文件系统树中有一个名称,并且可以对它们使用 和 系统调用read()write()如果我们考虑“一切都是字节流”的感觉,后者尤其重要,因为这些调用访问字节流。

由于相同的系统调用适用于常规文件、原始磁盘设备、终端、网络套接字和管道,因此可以使用相同的工具集。echo foo例如,无论输出连接在哪里,工作原理都是相同的。这可以简化实用程序的实现,并且更容易将它们应用于新的目的。 shell 或其他命令行实用程序不需要执行任何特殊操作即可通过管道或套接字连接到 SSH 服务器并通过网络进行访问。 (尽管对于交互式会话,SSH 创建了一个伪终端,因此它与本地会话没有什么不同。)

此外,当文件系统中存在许多内容时,可以使用shell 重定向 ( ) 列出ls并访问它们。这对于访问脚本中或从脚本中访问特殊文件非常有用,而无需特殊的二进制文件来进行不太常见的系统调用。catecho foo > .../proc/sys

还没一切是一个文件,或者是一个字节流,对于这些东西,并不是所有的事情都可以用read()and来完成write()。 UDP 套接字不是字节流,因为它们传输固定大小的多字节数据报。 (尽管read()仍然write()可以处理它们,只是有点不同。)一些操作仍然需要通过ioctl()系统调用来完成,并且 ioctl 操作是特定于设备的。在 Linux 上,网络设备在文件系统中没有名称。

另请参见例如

答案2

UNIX / Linux 系统中的所有内容都可以可视化为某种输入或输出设备。

磁盘是两者兼而有之——您要么向其中写入字节流,要么从中读取字节流。键盘是一种输入设备 - 您从键盘读取字节流。

解释此字节流取决于当前使用键盘的程序 - 无论是 shell、用户程序、系统程序还是其他程序。终端只是被写入 STDOUT 或 STDERR 的字节流。

当您谈论图形控制台时,这个类比有些不成立,但在每个终端窗口中它都成立。该终端窗口只是等待 shell/程序向其发送字节,并以文本或其他 ASCII 字符的形式向用户显示这些字节。

正如对此答案的评论中所指出的,当您深入系统时,这个类比会进一步崩溃。最初的短语“一切都是文件”和相关短语“一切都是字节流”似乎是为了简化那些刚接触系统或经验有限的人的系统视图而创造的。随着您获得经验并更多地参与 Linux,您会意识到这种简化有时是不正确的,但它对于刚刚熟悉该环境的人仍然有价值。

相关内容