了解匿名管道 ID

了解匿名管道 ID

我目前正在调试一个存在资源泄漏的系统。看来我们打开的管道太多了。当我列出我的管道时/proc/PROC_ID/fd,我会看到以下管道列表:

l-wx------ 1 root root 64 Jun 30 12:32 100 -> pipe:[39199]
lr-x------ 1 root root 64 Jun 30 12:32 99 -> pipe:[39199]

这表明管道是开放的,两端都是 RW。

当我使用时lsof,我看到有很多带有这个管道ID的结果

COMMAND    PID  TID           USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
myapp      7209                root   99r     FIFO                0,8       0t0      39199 pipe
myapp      7209                root  100w     FIFO                0,8       0t0      39199 pipe
myapp      7209 7210           root   99r     FIFO                0,8       0t0      39199 pipe
myapp      7209 7210           root  100w     FIFO                0,8       0t0      39199 pipe
myapp      7209 7211           root   99r     FIFO                0,8       0t0      39199 pipe
myapp      7209 7211           root  100w     FIFO                0,8       0t0      39199 pipe
myapp      7209 7212           root   99r     FIFO                0,8       0t0      39199 pipe
...

所以有几个线程使用管道。现在,我需要一些帮助来解释这些信息。

  1. 管道旁边的 ID(在 中ls)是什么?我可以通过某种方式从电话中获取它吗pipe()
  2. 为什么输入的是lsofisFIFO而不是PIPE?我检查了联机帮助页并且有一个单独的类型。难道是我听错了?我使用的是 RHEL 7.2

更新更清楚地说明第二个问题 - 从pipe:[<number>]的输出来看ls,该对象看起来像一个匿名管道。然而,lsof类型是FIFO而不是PIPE。我不明白这些如何引用同一个对象。

干杯

答案1

对于问题1:

根据使用 Shell 命令调试 IPC(参见第 8.7.1 节),39199inpipe:[39199]是索引节点号。与存储在物理设备上的“常规”文件不同,此类 inode 编号与实际文件无关,因为它们属于虚拟文件系统(请参阅第 8.8 节)。

据我了解,这些 inode 的重点不是“inode xxxx 指的是什么”,而是共享 inode 的进程实际上是在相互通信。此类过程可以通过以下方式输出:

lsof | grep <inodeNumber>

相关内容