如何在c中返回文件描述符

如何在c中返回文件描述符

我对此感到困惑。

fp=fopen(文件名,模式);

fopen() 返回的值是多少FP。该值是文件描述符整数吗?

fp 被称为流吗?如果不是如何返回流?流何时创建?

如何使用c返回打开文件的文件描述符?

FILE结构称为inode表吗?

答案1

fopen是一个库函数,它返回一个FILE数据结构。有关此结构的(简化)详细信息可以在这一页

该结构的成员中有一个char称为fd,标记为文件描述符。每次进程使用open系统调用打开文件时(确实如此fopen),都会在内核内部表中创建一个条目,称为 (全局)文件表

然后在另一个每进程表中创建另一个条目,称为用户文件描述符表。该条目指向前一个条目(在内核中)文件表),就像表中的任何条目一样,它有一个索引号。该索引是进程所感知的文件描述符

  • 文件描述符 0 保留用于标准输入。
  • 文件描述符 1 保留用于标准输出。
  • 文件描述符 2 保留用于标准错误输出。

因此,当你open在程序中第一次调用时,你很可能会得到文件描述符 3。然后会是 4、5,依此类推......

然后,此文件描述符可以用作您要对文件执行的每个操作(系统调用)的句柄:readwrite和(释放文件描述符)。您可以参考这些系统调用的手册页以获取更多信息。在库函数的手册中找到库函数使用的系统调用也很常见。例如,在 中,您将看到:lseekcloseman fopen

SEE ALSO
    open(2) ...

现在,这些概念溪流索引节点有点不同。第一个在 C 中纯粹是概念性的:数据流是您使用readwrite系统调用创建的。另一方面,索引节点号与存储管理的关系大于与文件访问的关系。在文件系统上,每个文件都与一个数据结构相关联,存储在文件系统的超级块中。该数据结构(称为索引节点)保存有关文件的几条元信息,例如:

  • 访问时间
  • 权限(模式)
  • 所有权
  • 类型(常规、目录、字符、块、管道...)
  • 文件的链接(路径)数量
  • 文件大小

该索引节点还允许内核定位文件片段在磁盘上的位置。有关这方面的更多信息,我建议阅读UNIX操作系统上的设计作者:Maurice J.Bach(第 4 章,第 1 节,“索引节点”)。你也可能对此有兴趣

相关内容