san*_*ica 4 c terminology file file-descriptor stream
有一些相关的概念,即文件指针、流和文件描述符。我知道文件指针是指向数据类型的指针(在eg和FILE中声明)。我知道文件描述符是,例如( 和)的成员。FILE.hstruct_FILE.hint_filenoFILE_IO_FILE
但从这里开始,我不清楚是否还有另一种类型的实体适用“文件状态标志”。具体来说,我不知道“文件状态标志”是否适用于FILE文件描述符或什么。我正在寻找显示具体细节的官方参考资料。
有关的:
文件描述符的规范(我问过这个)
文件句柄
当您第一次访问某个网站时,该网站可能会向您的浏览器提供 cookie。该 cookie 的值将根据浏览器将来的请求自动提供给网站。
此 cookie 的值对您来说可能是无意义的,但它对特定的 Web 服务器有意义。它称为会话 ID,是在某种数据库中查找记录的关键。该记录称为会话。
会话允许 Web 服务器根据较早的请求和较早的请求的结果对一个请求做出反应。例如,它允许服务器知道浏览器在先前的请求中向服务器提供了凭据,并且这些凭据已成功通过身份验证。这就是为什么您每次想要在 StackOverflow 上以特定用户身份发布/投票/编辑时不需要重新提供凭据。
cookie 的值(即会话 ID)是一个不透明的值。它对你来说没有任何意义。它有用的唯一方法是将其提供回给您的 Web 服务器。将其交给另一个网络服务器不会产生任何有用的结果。它只是识别另一个系统中存在的资源的一种方法。
当另一个系统是操作系统时,我们将这些资源标识不透明值称为“句柄”。这绝不是“句柄”一词唯一一次以这种方式使用,但却是最常见的。与会话 ID cookie 为 Web 服务器提供将 Web 请求链接在一起的方式大致相同,句柄为操作系统提供了将系统调用链接在一起的方式。各种资源都有句柄。有窗把手。有分配的内存缓冲区的句柄。还有文件句柄。
read通过在对或 的多次调用中使用相同的文件句柄write,操作系统知道前一个调用从哪里停止,从而从哪里继续。它还知道您有权访问正在读取或正在写入的文件,因为这些检查是在文件打开时完成的。
文件句柄不仅仅适用于普通文件。文件句柄还可以引用管道、套接字或许多其他事物之一。创建句柄后,您只需告诉操作系统您想要从中读取或写入,它将使用该句柄来查找执行此操作所需的信息。
文件描述符
这是 UNIX 世界中文件句柄的名称。open(2)表示返回一个文件描述符。read(2)表示取一个文件描述符。
FILE*又名FILE指针又名文件指针
这也是一个文件句柄。但与文件描述符不同的是,它不是来自操作系统。AFILE*是C库文件句柄。您无法将 a 传递FILE*给read(2)(系统调用),就像无法将文件描述符传递给fread(3)(C 库函数)一样。
您永远不应该访问 的成员FILE,假设它甚至有任何成员。与所有句柄一样,它对于接收它的人来说是不透明的。它应该是一个你看不到的盒子。违反此约定的代码不可移植,并且随时可能被破坏。
大多数 C 库文件句柄引用包含文件描述符的对象。(由fmemopen和open_memstream不返回的。)它还包括对缓冲的支持,甚至可能更多。
文件状态标志
这不是您永远需要使用的术语。我还是第一次听说。或者也许我只是忘记听到它,因为它并不重要。在链接的文档中,它用于引用一组常量。对于某些参数,可以为各种系统调用提供该组中的一些常量的一些组合。请参阅每个系统的文档,了解它可以接受哪些标志,以及这些标志对其有什么含义。
溪流
之前,我将文件句柄与会话 ID 进行了比较。如果会话 ID 允许 Web 服务器查找会话,那么用于查找的文件句柄是什么?C 库 I/O 函数的文档将其称为流。
流是一个松散的术语,通常指长度不确定的序列。这是通信中常用的术语,指的是编写者/发送者/生产者和读取者/接收者/消费者之间传送的数据。
流是按顺序访问的,无论是出于必要还是因为方便。跳转到流中不同点的可能性不会自动取消该术语的使用资格。正如我上面提到的,这是一个宽松的术语。
流的长度通常是未知的。发件人甚至可能不知道。以一个可能从其他流动态生成流的任务为例。一条流甚至可以无限长。有时,流的长度是已知的,但只是被忽略。有时,长度是已知的,但没有可用的单位。从流中读取可变长度行的程序可能无法对流的长度(以字节为单位)执行任何有用的操作。
假设两个程序通过管道进行通信,如cat <file1 | cat >file2. 我们可以将通过管道的数据称为流。发送者可能知道也可能不知道它最终将发送多少字节/行/消息。发送方将发送一些字节,然后再发送更多字节,直到它最终发出信号表明不再发送更多字节。读者通常不知道生产者最终将发送多少字节/行/消息。它将获取一些字节,然后再获取更多字节,直到最终通知它已到达流的末尾。
有时,更重要的是如何处理数据。例如,从文件读取通常被视为从流读取。虽然可以获得文件的长度,但此信息常常被忽略。相反,忽略此信息的程序只是不断从文件句柄中提取字节或行,直到收到到达流末尾的指示。
随机访问是文件不被视为流的示例。随机访问是指从文件的任意位置检索数据的做法。当拥有文件中所找到内容的索引时,就可以执行此操作。索引是键与文件中该键标识的项目位置之间的某种映射。例如,如果我知道在文件中的某个位置找到了与用户相关的数据,我可以从操作系统请求文件的该部分,而不是从头读取文件。
| 归档时间: |
|
| 查看次数: |
1520 次 |
| 最近记录: |