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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在创建管道,fifo或套接字时创建inode相关的知识,希望对你有一定的参考价值。

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

答案

不会为匿名管道或套接字创建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的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属于磁盘文件系统。

也可以看看:

以上是关于在创建管道,fifo或套接字时创建inode的主要内容,如果未能解决你的问题,请参考以下文章

在 Perl、套接字或命名管道 (fifos) 中啥更便携?

linux 有名管道(FIFO)

进程间通信 IPC(Inter-Process Communication)

什么时候应该使用 fifo 文件/命名管道?

Linux - 进程间通信 - 命名管道

IPC通信_有名管道(FIFO)