inode编号和文件描述符之间有什么区别?

rga*_*aut 11 filesystems inode file-descriptor

我理解文件描述符是用于标识文件的内核句柄,而文件的inode编号是指向具有关于文件的其他详细信息的结构的指针(如果我错了,请纠正我).但我无法区分它们.

use*_*740 13

一个索引节点是一个特定的文件系统的神器,以及如何管理间接."传统的*ix"文件系统使用它将文件链接到目录中,甚至将文件的多个部分链接在一起.也就是说,inode表示文件系统实现的物理表现形式.

在另一方面,一个文件描述符是一个不透明的标识符到一个打开的文件由内核.只要文件保持打开状态,就可以使用标识符来执行读取和写入等操作.的"文件"这里的用法是不是用一般的"磁盘上的文件"混淆-而在这种情况下一个文件代表一个流和操作,可以对其执行,不论其来源.

文件描述符是不相关的一个inode,除非这样可以通过特定[文件系统]驱动器内部使用.

  • 至少在 Linux 上,套接字确实有 inode 编号,您可以使用 `netstat -e`、`cat /proc/net/tcp` 或 `ls -l /proc/<pid>/fd` 来查看。 (2认同)
  • _“许多常用打开的文件(例如套接字和特殊设备)甚至没有索引节点!”_这是不正确的。[为什么特殊文件有 inode](https://unix.stackexchange.com/questions/384488/why-do-special-device-files-have-inodes)? (2认同)

dir*_*obs 7

差异并不大,两者都与称为"文件"的抽象术语有关.inode是表示文件的文件系统结构.而文件描述符是opensyscall 返回的整数.根据定义:

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

另一方面,文件描述符

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

内核不是按名称表示打开的文件,而是为每个进程使用一个条目数组来打开文件,因此有效的文件描述符是打开文件数组的索引.例如,假设您正在进行以下操作:

read(0, 10)
Run Code Online (Sandbox Code Playgroud)

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

Descriptor No. 
      0  --->          stdin
      1  --->          stdout
      2  --->          stderr
Run Code Online (Sandbox Code Playgroud)

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

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

 Descriptor No. 
      0  --->           stdin
      1  --->           stdout
      2  --->           stderr
      3  --->           /home/user100/out.txt  
      4  --->           /home/user100/file.txt
Run Code Online (Sandbox Code Playgroud)

看到OPEN(2)它解释了你打电话时表面下面会发生什么open.