创建管道、fifo 或套接字时创建 inode

发布于 2024-11-18 01:36:13 字数 52 浏览 3 评论 0原文

我有关于 Linux 的一般问题。如果我创建了fifo,inode也会创建吗?管道?插座?

I have general question about Linux. Will the inode be created if I create a fifo? pipe? socket?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏日浅笑〃 2024-11-25 01:36:13

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

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

 类型:[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]'

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

$ mkfifo foobar.fifo
$ ls -i foobar.fifo
1093642 foobar.fifo

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

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

另请参阅:

On Linux the answer can be obtained from /proc/<PID>/fd directory. To quote /proc documentation ( man 5 proc ):

For file descriptors for pipes and sockets, the entries will be
symbolic links whose content is the file type with the inode. A
readlink(2) call on this file returns a string in the format:

    type:[inode]

For example, socket:[2248868] will be a socket and its inode is
2248868. For sockets, that inode can be used to find more information in one of the files under /proc/net/.

Let's verify that:

$ 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]'

So will pipes and sockets have an inode ? Yes ! What about FIFOs ? We can guess that since they have a filename, they do have inode ( and I don't think directory entries without inode can exist ). But lets verify:

$ mkfifo foobar.fifo
$ ls -i foobar.fifo
1093642 foobar.fifo

The answer is "yes, FIFOs have inodes,too".

However, this raises an important question: inodes are properties of filesystems, and inodes aren't unique accross filesystems, so which filesystem is being referenced when we see a pipe inode ? Well, turns out there exists pipefs virtual filesystem which is mounted in Kernel space, rather than userspace. It manages both pipes and FIFOs, so the inode number you see is the /proc example is the property of those filesystems, rather than the filesystem you have on disk. And yes, anonymous pipes and anonymous sockets won't have inode on disk filesystem, because there's no filename and no bytes on disk (although there may be caching of data, and in fact old Unixes cached pipes to disk). FIFOs and Unix-domain sockets, however, have filename on the filesystem, so in foobar.fifo example that inode belongs on the disk filesystem.

See also:

油焖大侠 2024-11-25 01:36:13

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

然而,对于命名管道(又名fifo),索引节点是在作为文件系统实体存在时创建的。

No inode will be created for an anonymous pipe or a socket, as an inode is a property of a filesystem and neither of these two lives as a filesystem entity (they don't have a file path). They only have file descriptors.

However, for named pipes (aka fifo) an inode is created as it lives as an filesystem entity.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文