gpt4 book ai didi

c - "file pointer"、 "stream"、 "file descriptor"和... "file"之间的区别?

转载 作者:行者123 更新时间:2023-12-04 09:56:22 35 4
gpt4 key购买 nike

有一些相关的概念,即文件指针、流和文件描述符。
我知道文件指针是指向数据类型 FILE 的指针(在例如 FILE.hstruct_FILE.h 中声明)。
我知道文件描述符是 int ,例如成员(member)_filenoFILE (和 _IO_FILE )。

至于the subtle difference between stream and file , 我仍然在学习。

但来自 here ,我不清楚“文件状态标志”是否适用于另一种类型的实体。
具体来说,我不知道“文件状态标志”是否适用于 FILE , 到文件描述符,或者什么。
我正在寻找显示细节的官方引用资料。

有关的:

What's the difference between a file descriptor and file pointer?

Whats is difference between file descriptor and file pointer?

What is the concept behind file pointer or the stream pointer?

Specification of file descriptors (我问过这个)

difference between file descriptor and socket file descriptor

最佳答案

文件句柄

当您第一次访问某个网站时,该网站可能会向您的浏览器提供 cookie。此 cookie 的值将根据浏览器 future 的请求自动提供给网站。

这个 cookie 的值对你来说可能是胡言乱语,但它对那个特定的 web 服务器有意义。它被称为 session ID,它是在某种数据库中查找记录的键。此记录称为 session 。

session 允许 Web 服务器根据较早的请求和较早请求的结果对一个请求使用react。例如,它允许服务器知道浏览器在较早的请求中向服务器提供了凭据,并且这些凭据已成功通过身份验证。这就是为什么每次您想在 StackOverflow 上以特定用户的身份发布/投票/编辑时都不需要重新提供凭据的原因。

cookie 的值,即 session ID,是一个不透明的值。它对你没有任何意义。它唯一有用的方法是将其提供回提供给您的 Web 服务器。将它提供给另一个 Web 服务器不会实现任何有用的东西。它只是一种识别存在于另一个系统中的资源的方法。

当另一个系统是操作系统时,我们将这些识别资源的不透明值称为“句柄”。这绝不是句柄这个词唯一一次这样使用,但它是最常见的。与 session id cookie 为 Web 服务器提供一种将 Web 请求链接在一起的方式非常相似,句柄为操作系统提供了一种将系统调用链接在一起的方式。有各种资源的句柄。有 window Handlebars 。有分配的内存缓冲区的句柄。还有文件句柄。

通过在对 read 的多次调用中使用相同的文件句柄或 write ,操作系统知道上一个停止的位置,从而知道从哪里继续。它还知道您有权访问您正在读取或写入的文件,因为这些检查是在打开文件时完成的。

文件句柄不仅仅用于普通文件。文件句柄还可以引用管道、套接字或许多其他事物之一。创建句柄后,您只需要告诉操作系统您要从中读取或写入它,它就会使用句柄来查找执行此操作所需的信息。

文件描述符

这是 unix 世界中文件句柄的名称。 open (2) 据说返回一个文件描述符。 read (2) 据说取一个文件描述符。

FILE*又名 FILE指针又名文件指针

这也是一个文件句柄。但与文件描述符不同,它不是来自操作系统。一个 FILE*是一个 C 库文件句柄。你不能通过 FILE*read (2) (一个系统调用) 比你可以将文件描述符传递给 fread 的次数更多(3)(一个C库函数)。

你永远不应该访问 FILE 的成员,假设它甚至有任何。像所有 handle 一样,它对接收它的人来说是不透明的。它是一个你看不到的盒子。违反此约定的代码不可移植,并且可能随时中断。

大多数 C 库文件句柄引用一个包含文件描述符的对象。 (由 fmemopen open_memstream 返回的没有。)它还包括对缓冲的支持,可能还有更多。

文件状态标志

这不是您永远需要使用的术语。这是我第一次听到。或者也许我只是忘记听了,因为它并不重要。在链接文档中,它用于指代一组常量。可以为某些参数提供该组中某些常量的某些组合,为各种系统调用提供。请参阅每个系统的文档以了解它可以接受哪些标志,以及这些标志对它的意义。



早些时候,我将文件句柄与 session ID 进行了比较。如果 session ID 允许 Web 服务器查找 session ,那么用于查找的文件句柄是什么? C 库 I/O 函数的文档将其称为流。

流是一个松散的术语,通常指的是不确定长度的序列。它是通信中常用的术语,指的是在写入者/发送者/生产者和阅读者/接收者/消费者之间进行通信的数据。

流是按顺序访问的,无论是出于必要还是因为方便。跳转到流中不同点的可能性不会自动取消使用该术语的资格。就像我上面提到的,这是一个松散的术语。

流的长度通常是未知的。它甚至可能不为发件人所知。以一个可能从其他流中动态生成流的任务为例。一条流甚至可以无限长。有时,流的长度是可知的,但只是被忽略。有时,长度是已知的,但不是可用单位。从流中读取可变长度行的程序可能无法对以字节为单位的流长度做任何有用的事情。

以两个程序通过管道通信为例 cat <file1 | cat >file2 .我们可以将通过管道的数据称为流。发送方可能知道也可能不知道它最终会发送多少字节/行/消息。发送方将发送一些字节,然后再发送一些字节,直到它最终发出信号表示不会再发送。读者通常不知道生产者最终会发送多少字节/行/消息。它将获得一些字节,然后再获得更多,直到最终通知它已到达流的末尾。

有时,更多的是关于如何处理数据。例如,从文件中读取通常被视为从流中读取。虽然可以获得文件的长度,但通常会忽略此信息。相反,忽略此信息的程序只是不断地从文件句柄中提取字节或行,直到它接收到到达流末尾的指示为止。

随机访问是文件不被视为流的一个例子。随机访问是指从文件的任意位置检索数据的做法。当一个人拥有在文件中找到的内容的索引时,可能会这样做。索引是键与文件中由该键标识的项目的位置之间的某种映射。例如,如果我知道在文件的某个位置找到了与用户有关的数据,我可以从操作系统请求文件的那部分,而不是从一开始就读取文件。

关于c - "file pointer"、 "stream"、 "file descriptor"和... "file"之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61911258/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com