我有关于 Linux 的一般性问题。如果我创建一个fifo,会创建inode吗?管道?插座?
2 回答
不会为匿名管道或套接字创建任何 inode,因为 inode 是文件系统的属性,并且这两个都不是文件系统实体(它们没有文件路径)。它们只有文件描述符。
但是,对于命名管道(又名 fifo),创建一个 inode 是因为它作为文件系统实体存在。
在 Linux 上,答案可以从/proc/<PID>/fd
目录中获得。引用/proc
文档(man 5 proc):
对于管道和套接字的文件描述符,条目将是符号链接,其内容是带有 inode 的文件类型。对该文件的 readlink(2) 调用返回格式如下的字符串:
type:[inode]
例如,socket:[2248868] 将是一个套接字,其 inode 为 2248868。对于套接字,该 inode 可用于在 /proc/net/ 下的文件之一中查找更多信息。
让我们验证一下:
$ bash -c 'true | ls -l /proc/self/fd/0'
lr-x------ 1 user user 64 Sep 13 03:58 /proc/self/fd/0 -> 'pipe:[54741]'
那么管道和套接字会有一个 inode 吗?是的 !那么 FIFO 呢?我们可以猜测,因为它们有一个文件名,所以它们确实有 inode(而且我不认为没有 inode 的目录条目可以存在)。但是让我们验证一下:
$ mkfifo foobar.fifo
$ ls -i foobar.fifo
1093642 foobar.fifo
答案是“是的,FIFO 也有 inode”。
然而,这提出了一个重要的问题:inode 是文件系统的属性,并且inode 在整个文件系统中不是唯一的,那么当我们看到管道 inode 时引用的是哪个文件系统?好吧,事实证明存在安装在内核空间而不是用户空间中的pipefs
虚拟文件系统。它同时管理管道和 FIFO,因此您看到的 inode 编号是/proc
这些文件系统的属性,而不是磁盘上的文件系统。是的,匿名管道和匿名套接字在磁盘文件系统上不会有 inode,因为磁盘上没有文件名和字节(尽管可能有数据缓存,实际上旧的 Unix 缓存到磁盘的管道)。然而,FIFO 和 Unix 域套接字在文件系统上有文件名,所以在 foobar.fifo
inode 属于磁盘文件系统的示例。
也可以看看: