我知道文件描述符是识别文件的内核句柄,而文件的索引节点号是指向具有文件其他详细信息的结构的指针(如果我错了,请纠正我)。但我无法区分它们。
inode是特定文件系统的工件,以及它如何管理间接。"传统的*ix"文件系统使用它将文件链接到目录中,甚至将文件的多个部分链接在一起。也就是说,inode表示文件系统实现的物理表现形式。
另一方面,文件描述符是内核打开的文件的不透明标识符。只要文件保持打开状态,该标识符就可以用于执行读取和写入等操作。这里"文件"的用法是,而不是与一般的"磁盘上的文件"混淆——相反,本文中的文件表示一个流和可以对其执行的操作,无论其来源如何。
文件描述符与索引节点无关,除非特定的[文件系统]驱动程序在内部使用。
区别不大,两者都与名为"文件"的抽象术语有关。inode是一种表示文件的文件系统结构。而文件描述符是open
系统调用返回的整数。根据定义:
文件由索引节点表示。文件的索引节点是由文件系统保存的一个结构,它保存有关文件的信息,如文件类型、所有者、权限、索引节点链接数等
另一方面,文件描述符
文件描述符:
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
时,曲面下面会发生什么。
根本区别在于inode代表文件,而文件描述符(fd)代表访问文件的票证,权限和时间窗口有限。您可以将inode视为文件的一种复杂ID。每个文件对象都有一个唯一的inode。另一方面,文件描述符是一个"文件描述符";打开";文件。用户程序不知道文件的inode。它使用fd来访问文件。根据用户的权限和用户程序选择的打开文件的模式(例如只读),允许fd对文件执行一组特定的操作。一旦fd是"0";闭合的";除非打开另一个fd,否则用户程序无法访问该文件。在任何给定的时间,可能有多个fds访问相同或不同用户程序中的文件。