- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一些相关的概念,即文件指针、流和文件描述符。
我知道文件指针是指向数据类型 FILE
的指针(在例如 FILE.h
和 struct_FILE.h
中声明)。
我知道文件描述符是 int
,例如成员(member)_fileno
的 FILE
(和 _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/
在指向指针的指针上使用指针算术是否定义明确? 例如 int a=some_value; int* p=&a; int**p2=&p; 现在对 p2 执行算术是否是定义明确的行为?(例如 p2+1、p2
我正在尝试使用一个函数来替代 C 中的 scanf()。该函数是由第三方编写的,并进行了相应的定义: ScanDecimal16uNumber - Scans a decimal 16bit unsi
我正在尝试为 Sundials CVODE 编写 CFFI 包装器图书馆。 SWIG 被 Sundial header 阻塞,因为它们相互关联,并且 SWIG 找不到合适的 header ,所以我手工
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: pass by reference not working 我正在阅读一些教程 linklistproblem在互联
我有一个代码片段很难理解。 char *c; // c is uni dimensional table ( single row ) char **p ; // p is a two dimen
我正在将一些代码移植到 Windows 并且被难住了。有一些代码在启动时自动运行以将指针复制到指针,并在退出时再次运行以删除指向指针的指针(如果它不为空)。 我已经创建了一个示例程序来重现该行为 in
将非 const 指针转换为 const 指针是合法的。 那为什么将指向非const的指针转换为指向const的指针是不合法的呢? 例如,为什么下面的代码是非法的: char *s1 = 0; con
将非 const 指针转换为 const 指针是合法的。 那为什么将指向非const的指针转换为指向const的指针是不合法的呢? 例如,为什么下面的代码是非法的: char *s1 = 0; con
将指向非常量的指针转换为指向常数的指针是合法的。 那么为什么将指向非const的指针转换为指向const的指针是不合法的呢? 例如,为什么下面的代码是非法的: char *s1 = 0; const
之间有什么区别 procedure(some_routine), pointer :: ptr ptr => null() 和 procedure(some_routine), pointer ::
只是为了消除一些困惑。我最近遇到了这段代码(使用指针到指针): int encode(unsigned char type, uint64_t input_length, unsigned char*
我已经阅读了我能找到的有关 C/C++ 指针的内容,但其中大部分是介绍性的,虽然它可以帮助您理解它们的使用,但在许多情况下,现有代码会抛出难以破译的示例。 我确实看到了一些例子,他们将一行代码分解成它
我一直在关注的学习数据结构的书使用“单指针”作为函数中的参数,这些函数在链表的不同位置添加新节点,例如在开始,在结束。同样在删除的情况下使用“pointer-to-pointer”。在所有这些情况下,
考虑这段代码: #define MAX 4 ............ ............ int** ptr = (int**)malloc(sizeof(int*)*MAX); *ptr =
如何将指向 void 对象的指针转换为类对象? 最佳答案 使用 static_cast。请注意,只有当指针确实指向指定类型的对象时,您才必须这样做;也就是说,指向 void 的指针的值取自指向此类对象
我假设一种语言的实现允许您将指针视为整数,包括对它们进行标准算术。如果由于硬件限制这是不现实的,请告诉我。如果编程语言通常没有这么强大的指针运算,但是在实践中是可行的,那么我仍然想知道这种实现BigI
我是一名 nodejs 开发人员,我通常为我的应用程序使用一个结构,该结构包含一个配置包/对象,该对象包含对我常用的库和配置选项的引用。通常,此配置对象也包含我的数据库连接,并且可以通过我的应用程序访
我已经在几个上下文中阅读过“胖指针”这个术语,但我不确定它的确切含义以及它何时在 Rust 中使用。指针似乎是普通指针的两倍,但我不明白为什么。它似乎也与特征对象有关。 最佳答案 术语“胖指针”用于指
这是让我困惑的代码。 static char *s[] = {"black", "white", "pink", "violet"}; char **ptr[] = {s+3, s+2, s+1, s
通用指针允许您创建指向指针的指针: void foo(Object **o) {} int main() { Object * o = new Object(); foo(&o); } s
我是一名优秀的程序员,十分优秀!