为什么 C 将 FILE 用于 stdin/stdout 流以及文件操作?

Why does C use FILE for stdin/stdout streams as well as file operations?

提问人:programme3219873 提问时间:9/25/2021 最后编辑:Jorengarenarprogramme3219873 更新时间:9/25/2021 访问量:292

问:

我最近研究了 C 中的文件和输入/输出,并很快发现 C 使用了一种称为 ed 结构的结构,该结构通常表示为指向结构的指针。
此结构包含有关输入和输出的数据,因此操作系统和内核的较低级别部分可以轻松管理系统上的输入和输出,例如输入数据的大小、数据类型等。 基本上,它是故意抽象的,因为它的工作方式非常低级。
typedefFILE

我还知道 C 程序员通常使用类似的东西来表示输入和输出流。C 还允许通常用于指向文件。FILE* xFILE

为什么 C 允许程序员用来表示文件以及输入/输出流?对我来说,这听起来很令人困惑,因为这个关键字是字面意义上的,我认为它经常会让新程序员感到困惑,认为它只用于指向文件。FILEFILEFILE

那么,为什么同时用于文件和输入/输出呢?FILE

C 文件-IO

评论

8赞 Jorengarenar 9/25/2021
因为在 Unix 上“一切都是文件”,而 C 是专门为此操作系统创建的
2赞 Steve Summit 9/25/2021
基本上是故意抽象的......右。它是一个抽象的 I/O 流。这个名字有点用词不当。您可以使用 a 来表示文件、设备、网络流甚至内存中字符串的 I/O。FILEFILE *
0赞 programme3219873 9/25/2021
@SteveSummit基本上可以用来表示计算机上的任何输入/输出设备?由于链接的结构也占所有输入/输出设备?FILEFILE
0赞 Steve Summit 9/25/2021
@programme3219873 最初,a 是 Unix 文件描述符之上的缓冲方案的“句柄”。实际上,Unix文件描述符指的是可以“考虑所有输入/输出设备”的数据结构。据我所知,这通常仍然是它今天的实现方式,尽管它可以有自己的间接级别来处理不同的“设备”。(通常,该级别的唯一间接级别是在 I/O 到 Unix 文件描述符之间,而不是在 I/O 到字符串之间。FILE *FILE *
1赞 John Bode 9/25/2021
@programme3219873:A 表示字节流,而不是设备。字节流是字节流,无论该流的源或目标是文件、打印机还是网络流。FILE

答:

7赞 ikegami 9/25/2021 #1

尽管它的名字,与文件无关。例如,不能使用 .您无法使用 .FILEFILEFILE

FILE始终表示流。此流是否与纯文件、管道或套接字相关联无关紧要。

评论

0赞 programme3219873 9/25/2021
那么,这是否意味着它只是一个对象类型,可用于表示计算机上的任何输入/输出设备?由于链接的结构也占所有输入/输出设备?FILEFILE
0赞 ikegami 9/25/2021
不,它用于表示流。它也与设备无关。
0赞 programme3219873 9/25/2021
“流”到底是什么意思?
1赞 Edwin Buck 9/25/2021
它实际上不是一个流,更像是一个可能可读/可能可写的标识符。所有块设备也都通过文件访问,流意味着字符设备。
0赞 ikegami 9/25/2021
Re “你说的'流'到底是什么意思?”,“流是数据的源或接收器,通常是单个字节或字符。
1赞 Basile Starynkevitch 9/25/2021 #2

在 Linux 系统上,您可以研究 GNU glibc 的源代码。它是开源代码。

然后将 a 定义为指向 some 的指针,其中包含打开的文件描述符编号、some 缓冲区等......FILEstruct

这个简称是历史性的。发明于 Unix 计算机内存不到 256 KB 和旋转硬盘仅几兆字节的时代。阅读维基百科上关于Unix历史的文章FILE

4赞 Edwin Buck 9/25/2021 #3

由于名称错误,因此它不表示文件。它表示可以读取和写入的内容。读取和写入可以以单个字符大小(流)或批量(块)完成。FILE

因此,如果您想要键盘输入,为什么不从键盘缓冲区读取呢?如果要发送 Web 请求,为什么不将一个请求写入出站网络缓冲区?你会用什么来做到这一点?

一旦 UNIX 和 C 的设计者意识到许多项目的核心共同特性集是读取和写入的能力,他们就将该模式重用于许多人们不认为是文件的东西。这就是 UNIX“一切都是文件”口号背后的动机。目录是文件,包含其他文件的名称和位置。磁盘是文件,需要遵循文件系统布局约束的写入。屏幕是文件,需要终端控制代码和文本。

文件发生了什么,这个强大想法的开始?它们仍然存在,但 C 语言中的构造更像是内核中的一个 ID,用于可能从中读取或写入的东西,并且不能保证回到磁盘上文件的常规概念。FILE

评论

0赞 Edwin Buck 9/25/2021
重命名它的唯一问题是,我们真的不知道它应该命名什么。Stream 意味着如何使用它,许多句柄都是使用基于块的传输进行访问的。FILE
0赞 programme3219873 9/25/2021
惊人的答案谢谢
0赞 ikegami 9/26/2021
Re “* Stream 暗示如何使用它*”,这就是为什么它是一个好名字。句柄是使用基于块的传输进行访问的。回复“许多 FILE 句柄都是使用基于块的传输进行访问的”,在数百万个流中,我从未使用过这样的流,所以说“许多”是一个巨大的夸张。无论如何,这一点是完全错误的。流并不意味着字节。流通常用于字节以外的其他内容(视频帧、水等)。关键方面是它是一个可能长度不确定的序列。
0赞 Edwin Buck 9/26/2021
流意味着有序阅读。文件句柄可以执行更多操作。它们可以根据偏移量进行读取。他们可以重置回起点。Stream 不是一个坏名字,只是它已经在更窄的上下文中使用了。
1赞 0___________ 9/25/2021 #4

在许多系统(如 Linux)中(几乎),一切都是一个文件。终端、网卡、随机数生成器、设备树等等。Stream(或文件)对于几乎任何:)都是一个非常好的抽象