【问题标题】:What is the difference between inode number and file descriptor?inode 编号和文件描述符有什么区别?
【发布时间】:2014-11-07 06:41:00
【问题描述】:

我知道文件描述符是识别文件的内核句柄,而文件的 inode 号是指向具有文件其他详细信息的结构的指针(如果我错了,请纠正我)。但我无法区分它们。

【问题讨论】:

    标签: filesystems file-descriptor inode


    【解决方案1】:

    inode 是特定文件系统及其管理间接的方式的产物。 “传统的 *ix”文件系统使用它来将文件链接到目录中,甚至将文件的多个部分链接在一起。也就是说,一个 inode 代表 文件系统实现的物理表现

    另一方面,file descriptor 是内核打开文件的不透明标识符。只要文件保持打开状态,该标识符就可以用于执行读取和写入等操作。此处“文件”的用法不要与一般的“磁盘上的文件”相混淆 - 在这种情况下,文件表示可以在其上执行的流和操作,无论来源。

    文件描述符与inode相关,除非它可能被特定的[文件系统]驱动程序在内部使用。

    【讨论】:

    • 因此文件描述符将由内核维护,每次进程打开一个文件时,都会在该表中创建相应的条目(由内核生成)。这是真的吗?
    • @rgaut 基本上,是的。 (文件描述符也是跨进程隔离的,但可以被孩子/叉子继承。)
    • @user2864740 :文件描述符和文件编号之间的关系(如果有)是什么(inumber 是文件系统上文件的唯一编号,映射到文件名目录结构并用于跟踪文件的硬链接)?除了其他元数据之外,inode 是否还包含文件的编号?谢谢!
    • 至少在 Linux 上,套接字确实有 inode 编号,您可以通过 netstat -ecat /proc/net/tcpls -l /proc/<pid>/fd 看到。
    • “许多常用打开的文件(例如套接字和特殊设备)甚至没有 inode!” 这是不正确的。 Why do special files have inodes?
    【解决方案2】:

    区别不大,两者都与称为“文件”的抽象术语有关。 inode 是一种文件系统结构,代表文件。而文件描述符是open 系统调用返回的整数。根据定义:

    文件由 inode 表示。文件的 inode 是由文件系统保存的结构,它保存有关文件的信息,例如文件的类型、所有者、权限、inode 链接计数等。

    另一方面,文件描述符

    File Descriptors: open 调用返回的值称为文件描述符,本质上是内核保存的打开文件数组的索引。

    内核不通过名称来表示打开的文件,而是使用一个条目数组来表示每个进程的打开文件,因此文件描述符实际上是打开文件数组的索引。例如,假设您正在一个进程中执行以下操作:

    read(0, 10)
    

    0 表示文件描述符编号,10 表示读取 10 个字节。在这种情况下,进程从索引 0 中的文件/流中请求 10 个字节,这是标准输入。内核自动授予每个进程三个打开的​​流:

    Descriptor No. 
          0  --->          stdin
          1  --->          stdout
          2  --->          stderr
    

    这些描述符由内核免费提供给您。

    现在,当您打开一个文件时,在通过open("/home/myname/file.txt") 系统调用的过程中,您将获得新打开文件的索引 3,打开另一个文件,您将获得索引 4,依此类推。这些是进程中打开文件的描述符:

     Descriptor No. 
          0  --->           stdin
          1  --->           stdout
          2  --->           stderr
          3  --->           /home/user100/out.txt  
          4  --->           /home/user100/file.txt
    

    请参阅OPEN(2),它解释了当您致电open 时会发生什么。

    【讨论】:

      【解决方案3】:

      根本区别在于,inode 代表文件,而文件描述符 (fd) 代表访问文件的票证,具有有限的权限和时间窗口。您可以将 inode 视为文件的一种复杂 ID。每个文件对象都有一个唯一的 inode。另一方面,文件描述符是特定用户“打开”的文件。用户程序不知道文件的 inode。它使用 fd 访问文件。根据用户的权限和用户程序选择打开文件的模式(例如只读),允许 fd 对文件进行特定的操作。一旦 fd “关闭”,用户程序就无法访问该文件,除非它打开另一个 fd。在任何给定时间,都可以有多个 fds 访问相同或不同用户程序中的文件。

      【讨论】:

      • 所以 fd 指向磁盘上的实际内存,而文件名指向 inode 指向磁盘上的内存,对吧?所以我猜你可以将文件(名称) mv 到另一个文件(名称),但与此同时 fd 仍然指向内存中的同一个地方,对吧?
      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 2012-01-01
      • 2013-04-21
      • 2014-04-25
      • 2012-03-22
      • 2017-09-19
      • 2011-10-13
      • 2014-08-14
      相关资源
      最近更新 更多