我对Linux有一般性的疑问。如果我创建一个fifo,是否会创建inode?管?插座?
答案 0 :(得分:5)
不会为匿名管道或套接字创建inode,因为inode是文件系统的属性,并且这两者都不是文件系统实体(它们没有文件)路径)。它们只有文件描述符。
但是,对于命名的管道(又名fifo),创建一个inode作为文件系统实体。
答案 1 :(得分:2)
在Linux上,可以从/proc/<PID>/fd
目录获得答案。引用/proc
文档(man 5 proc):
对于管道和套接字的文件描述符,条目将为 符号链接,其内容是带有索引节点的文件类型。一种 对该文件的readlink(2)调用返回以下格式的字符串:
type:[inode]
例如,套接字:[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。”
但是,这提出了一个重要的问题:索引节点是文件系统的属性,而inodes aren't unique accross filesystems是一个管道,因此当我们看到管道索引节点时,将引用哪个文件系统?好吧,事实证明存在pipefs
virtual filesystem,它安装在内核空间而不是用户空间中。它同时管理管道和FIFO,因此您看到的/proc
示例的索引节点号是这些文件系统的属性,而不是磁盘上的文件系统的属性。是的,匿名管道和匿名套接字将在磁盘文件系统上没有索引节点,因为磁盘上没有文件名和字节(尽管可能存在数据缓存,并且实际上旧的Unix将管道缓存到磁盘)。但是,FIFO和Unix域套接字在文件系统上具有文件名,因此在foobar.fifo
示例中,inode属于磁盘文件系统。
另请参阅: