【问题标题】:What is the difference between an open file and inode?打开的文件和 inode 有什么区别?
【发布时间】:2012-03-22 02:21:02
【问题描述】:

我正在阅读 Linux 设备驱动程序编程第 3 版,我一直在尝试掌握 openfile 与 inode 的区别。从书中所说,“内核中的文件结构被认为是一个打开的文件。”该书还说:“inode 结构在内核内部用于表示文件。因此,它不同于用于表示打开文件的文件结构。”这句话本身让我很困惑,因为在我看来,文件和打开的文件是同一回事。我什至不明白在这种情况下打开文件是什么意思。我很困惑,什么是打开的文件?什么是inode?又有什么区别呢?

【问题讨论】:

    标签: c linux-kernel driver device


    【解决方案1】:

    ext2+、NTFS 和其他文件系统在驱动器上有一个文件主表,而目录只是一种特殊类型的文件,其中包含指向文件表中条目的记录。 (此设置允许硬链接,以及通过目录结构不可见的“临时文件”。)“inode”是 Linux(可能还有其他 *nixes)对这些主文件表条目的术语。

    但是,inode 不会跟踪文件中的当前位置或当前模式(打开以进行读取、写入,两者都...?)。它只包含帮助操作系统在磁盘上查找文件内容并阻止不应该弄乱它的人这样做的信息。您需要不同的结构来跟踪该信息。这可能是您看到的“打开文件”结构。

    显然,“文件”结构内部也有一个结构,其中充满了指向函数的指针,这些函数可以用来处理文件。这将是为了支持 Unix 的“一切都是文件”理念,并让您可以像对常规文件一样读取和写入套接字,并提供一种抽象文件系统的方法 -代码中适用于所有内容的特定代码(这使得支持多种文件系统类型变得更加容易)。

    【讨论】:

      【解决方案2】:

      inode 基本上是位于多个文件之一中的数据(它实际上是某种表的索引,您可以使用它来定位该数据)。

      另一方面,文件是指向 inode 的目录条目。

      这就是类 UNIX 操作系统实现硬链接的方式,即两个文件“等效”的能力,因此更改一个文件会更改另一个文件。由于每个文件系统的 inode 都是唯一的,因此您可以有多个文件引用相同的数据(当然,只要它位于同一文件系统上)。

      【讨论】:

      • 哦,是的,我想我记得读过类似的东西,但我第一次看不太舒服。我想我会好一点。我关心的实际数据是 inode,而文件只是一些指向该数据的指针。可能有许多指向该 inode 的指针。谢谢,这一切都清楚了!
      【解决方案3】:

      inode 是表示文件的磁盘元数据。它包含文件的权限位、创建/修改/访问时间戳、实际文件类型、文件大小等...

      “打开的文件”只是您进程中的一点内存。通常它是一个数组条目,您从 fopen() 调用获得的文件句柄是特定的数组键。该数组条目将包含(除其他外)光标在文件中的当前位置,您将使用 fwrite/fread 调用读取/写入数据。

      【讨论】:

      • fopen()... 你的意思是open()
      • 所以你是说inode只是描述了我们正在谈论的数据或文件?打开的文件指向数据本身?我说的对吗?
      • 没有。打开的文件指向一个进程中的数据结构。代表您的应用程序如何处理文件的东西。文件是如何打开的,您在文件中查看的位置等...
      • @MarcB:如果我调用open,我没有得到进程内数据结构,我得到的是内核中的数据结构。或者您是否将内核内存计为进程的一部分?
      • 你从 open 得到的是一个指向 libc/glibc 在某处创建的数组的索引,其中包含打开的文件数据。它在进程中,但通常不是您自己的代码需要担心的事情。每个进程都有自己的“打开文件”数组。该数组也是“最大打开文件”限制的来源。一旦你打开了足够多的文件来占据整个数组,你就不能再打开了,因为没有多余的数组条目可供使用,也没有办法动态扩展/扩展数组。
      【解决方案4】:

      根据内核设备驱动程序 3rd (ldd3):

      内核内部使用inode结构来表示 文件。因此,它不同于文件结构 表示打开的文件描述符。可以有很多文件 表示单个文件上的多个打开描述符的结构, 但它们都指向一个单一的 inode 结构。

      【讨论】:

        【解决方案5】:

        inode 是“文件”(例如 /etc/passwd)或“目录”(例如 /等等)。 但是,“struct file”是“文件”或“目录”的 inode 上更改(例如打开-读取/写入-关闭)实例的一部分。

        每个文件系统(包括 VFS)都必须提供基本机制: 1)“文件”或“目录”的表示;那是inode。 2)操作inode的操作;即打开-读/写-关闭。每次我们打开一个“文件”或“目录”时,我们都会在内核中得到一个“结构文件”。所以我们可以为一个“文件”或“目录”有许多“结构文件”。每个“结构文件”都反映了对其的操作。 'struct file' 中有一些标志和模式以及 lseek,我们用来协助打开-读取/写入-关闭。

        【讨论】:

          猜你喜欢
          • 2014-11-07
          • 2014-04-30
          • 1970-01-01
          • 1970-01-01
          • 2014-04-08
          • 1970-01-01
          • 2016-07-05
          • 2012-10-26
          • 1970-01-01
          相关资源
          最近更新 更多