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

问题描述 投票:4回答:2

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

linux sockets pipe inode
2个回答
5
投票

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

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


2
投票

在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的directory entries可以存在)。但是让我们验证:

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

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

但是,这提出了一个重要的问题:inode是文件系统和inodes aren't unique accross filesystems的属性,所以当我们看到管道inode时会引用哪个文件系统?好吧,事实证明存在pipefs virtual filesystem,它安装在内核空间,而不是用户空间。它管理管道和FIFO,所以你看到的inode数字是/proc示例是那些文件系统的属性,而不是你在磁盘上的文件系统。是的,匿名管道和匿名套接字不会在磁盘文件系统上有inode,因为磁盘上没有文件名和字节(尽管可能存在数据缓存,实际上旧的Unix缓存管道到磁盘)。但是,FIFO和Unix域套接字在文件系统上有文件名,因此在foobar.fifo示例中,inode属于磁盘文件系统。

也可以看看:

© www.soinside.com 2019 - 2024. All rights reserved.