在创建管道,fifo或套接字时创建inode

mac*_*ows 4 sockets linux inode pipe

我对Linux有一般性的疑问.如果我创建一个fifo,是否会创建inode?管?插座?

Ser*_*nyy 8

在 Linux 上,可以从目录中获取答案/proc/<PID>/fd。引用/proc文档(man 5 proc):

\n\n
\n

对于管道和套接字的文件描述符,条目将是符号链接,其内容是带有 inode 的文件类型。对此文件的\n readlink(2) 调用将返回以下格式的字符串:

\n\n
    type:[inode]\n
Run Code Online (Sandbox Code Playgroud)\n\n

例如,socket:[2248868] 将是一个套接字,其 inode 为\n 2248868。对于套接字,该 inode 可用于在 /proc/net/ 下的文件之一中查找更多信息。

\n
\n\n

让我们验证一下:

\n\n
$ bash -c \'true | ls -l /proc/self/fd/0\'\nlr-x------ 1 user user 64 Sep 13 03:58 /proc/self/fd/0 -> \'pipe:[54741]\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么管道和套接字会有索引节点吗?是的 !FIFO 怎么样?我们可以猜测,由于它们有文件名,因此它们确实有索引节点(并且我认为没有索引节点的目录条目不能存在)。但让我们验证一下:

\n\n
$ mkfifo foobar.fifo\n$ ls -i foobar.fifo\n1093642 foobar.fifo\n
Run Code Online (Sandbox Code Playgroud)\n\n

答案是“是的,FIFO 也有 inode”。

\n\n

然而,这提出了一个重要的问题:索引节点是文件系统的属性,并且索引节点在文件系统中不是唯一的,因此当我们看到管道索引节点时正在引用哪个文件系统?事实证明,存在安装在内核空间而不是用户空间中的pipefs虚拟文件系统。它管理管道和 FIFO,因此您看到的 inode 编号是/proc这些文件系统的属性,而不是磁盘上的文件系统的属性。是的,匿名管道和匿名套接字在磁盘文件系统上不会有 inode,因为磁盘上没有文件名和字节(尽管可能有数据缓存,实际上旧的 Unix 将管道缓存到磁盘)。然而,FIFO 和 Unix 域套接字在文件系统上有文件名,因此 foobar.fifo示例中,inode 属于磁盘文件系统。

\n\n

也可以看看:

\n\n\n


Dar*_*ust 5

不会为匿名管道或套接字创建inode ,因为inode是文件系统的属性,并且这两者都不是文件系统实体(它们没有文件路径).它们只有文件描述符.

但是,对于命名管道(也称为fifo),创建一个inode作为文件系统实体.