我对此感到困惑。
fp=fopen(文件名,模式);
fopen() 返回的值是多少FP。该值是文件描述符整数吗?
fp 被称为流吗?如果不是如何返回流?流何时创建?
如何使用c返回打开文件的文件描述符?
FILE结构称为inode表吗?
答案1
fopen
是一个库函数,它返回一个FILE
数据结构。有关此结构的(简化)详细信息可以在这一页。
该结构的成员中有一个char
称为fd
,标记为文件描述符。每次进程使用open
系统调用打开文件时(确实如此fopen
),都会在内核内部表中创建一个条目,称为 (全局)文件表。
然后在另一个每进程表中创建另一个条目,称为用户文件描述符表。该条目指向前一个条目(在内核中)文件表),就像表中的任何条目一样,它有一个索引号。该索引是进程所感知的文件描述符。
- 文件描述符 0 保留用于标准输入。
- 文件描述符 1 保留用于标准输出。
- 文件描述符 2 保留用于标准错误输出。
因此,当你open
在程序中第一次调用时,你很可能会得到文件描述符 3。然后会是 4、5,依此类推......
然后,此文件描述符可以用作您要对文件执行的每个操作(系统调用)的句柄:read
、write
和(释放文件描述符)。您可以参考这些系统调用的手册页以获取更多信息。在库函数的手册中找到库函数使用的系统调用也很常见。例如,在 中,您将看到:lseek
close
man fopen
SEE ALSO
open(2) ...
现在,这些概念溪流和索引节点有点不同。第一个在 C 中纯粹是概念性的:数据流是您使用read
和write
系统调用创建的。另一方面,索引节点号与存储管理的关系大于与文件访问的关系。在文件系统上,每个文件都与一个数据结构相关联,存储在文件系统的超级块中。该数据结构(称为索引节点)保存有关文件的几条元信息,例如:
- 访问时间
- 权限(模式)
- 所有权
- 类型(常规、目录、字符、块、管道...)
- 文件的链接(路径)数量
- 文件大小
该索引节点还允许内核定位文件片段在磁盘上的位置。有关这方面的更多信息,我建议阅读UNIX操作系统上的设计作者:Maurice J.Bach(第 4 章,第 1 节,“索引节点”)。你也可能对此有兴趣这。