【发布时间】:2014-11-07 06:41:00
【问题描述】:
我知道文件描述符是识别文件的内核句柄,而文件的 inode 号是指向具有文件其他详细信息的结构的指针(如果我错了,请纠正我)。但我无法区分它们。
【问题讨论】:
标签: filesystems file-descriptor inode
我知道文件描述符是识别文件的内核句柄,而文件的 inode 号是指向具有文件其他详细信息的结构的指针(如果我错了,请纠正我)。但我无法区分它们。
【问题讨论】:
标签: filesystems file-descriptor inode
inode 是特定文件系统及其管理间接的方式的产物。 “传统的 *ix”文件系统使用它来将文件链接到目录中,甚至将文件的多个部分链接在一起。也就是说,一个 inode 代表 文件系统实现的物理表现。
另一方面,file descriptor 是内核打开文件的不透明标识符。只要文件保持打开状态,该标识符就可以用于执行读取和写入等操作。此处“文件”的用法不要与一般的“磁盘上的文件”相混淆 - 在这种情况下,文件表示可以在其上执行的流和操作,无论来源。
文件描述符不与inode相关,除非它可能被特定的[文件系统]驱动程序在内部使用。
【讨论】:
netstat -e、cat /proc/net/tcp 或 ls -l /proc/<pid>/fd 看到。
区别不大,两者都与称为“文件”的抽象术语有关。 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 时会发生什么。
【讨论】:
根本区别在于,inode 代表文件,而文件描述符 (fd) 代表访问文件的票证,具有有限的权限和时间窗口。您可以将 inode 视为文件的一种复杂 ID。每个文件对象都有一个唯一的 inode。另一方面,文件描述符是特定用户“打开”的文件。用户程序不知道文件的 inode。它使用 fd 访问文件。根据用户的权限和用户程序选择打开文件的模式(例如只读),允许 fd 对文件进行特定的操作。一旦 fd “关闭”,用户程序就无法访问该文件,除非它打开另一个 fd。在任何给定时间,都可以有多个 fds 访问相同或不同用户程序中的文件。
【讨论】: