【问题标题】:creating inode while creating pipe, fifo or socket在创建管道、fifo 或套接字时创建 inode
【发布时间】:2011-06-29 11:11:55
【问题描述】:

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

【问题讨论】:

    标签: linux sockets pipe inode


    【解决方案1】:

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

    但是,对于 named 管道(又名 fifo),会创建一个 inode,因为它作为文件系统实体存在。

    【讨论】:

    • Unix 域套接字也可以在文件系统中具有名称。详情请见unix(7)
    • @sarnold:很好,我忘了他们。幸运的是,它们是唯一接触文件系统的套接字。
    • 重要的是要注意,在这个答案中,“文件系统”是指磁盘上的文件系统。 Linux 中有多个文件系统,包括用户空间中的/proc//dev//sys 等虚拟文件系统,然后在内核空间中存在文件系统,它们实际上也是 inode 编号。有关该主题,请参阅 my answer
    【解决方案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 属于磁盘文件系统。

    另见:

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      相关资源
      最近更新 更多