在创建管道,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) 中啥更便携?