我知道文件描述符是用于识别文件的内核句柄,而文件的索引节点号是指向具有有关文件其他详细信息的结构的指针(如果我错了,请纠正我)。但我无法理解它们之间的区别。
inode 是特定文件系统及其管理间接方式的工件。 “传统的 *ix”文件系统使用它将文件链接到目录中,甚至将文件的多个部分链接在一起。也就是说,索引节点代表“文件系统实现的物理表现”。 另一方面,
a文件描述符是内核打开的文件的不透明标识符。只要文件保持打开状态,该标识符就可以用于执行读取和写入等操作。这里“文件”的用法不要与一般的“磁盘上的文件”混淆 - 相反,在此上下文中的文件代表一个流以及可以对其执行的操作,无论来源如何。 文件描述符与 inode
不相关,除非可以由特定的[文件系统]驱动程序在内部使用。
open
系统调用返回的整数。根据定义:
Inode 代表文件。文件的 inode 是文件系统保存的结构,它保存有关文件的信息,例如文件的类型、所有者、权限、inode 链接计数等。另一方面,文件描述符
文件描述符:
内核并不通过名称来表示打开的文件,而是使用每个进程的打开文件的条目数组,因此文件描述符实际上是打开文件数组的索引。例如,假设您在进程中执行以下操作:open
调用返回的值称为文件描述符,本质上是内核保存的打开文件数组的索引。
read(0, 10)
0表示文件描述符号,10表示读取10个字节。在这种情况下,进程从索引 0 中的文件/流请求 10 个字节,这是 stdin。内核自动授予每个进程三个打开的流:
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
时,表面之下发生了什么。