![/proc/PID/fd/X 链接号](https://linux22.com/image/16632/%2Fproc%2FPID%2Ffd%2FX%20%E9%93%BE%E6%8E%A5%E5%8F%B7.png)
在 Linux 中,/proc/PID/fd/X
管道或套接字文件描述符的链接有一个数字,例如:
l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839]
l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839]
lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925]
lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926]
lr-x------ 1 user user 64 Mar 24 00:05 5 -> pipe:[3142927]
l-wx------ 1 user user 64 Mar 24 00:05 6 -> pipe:[3142927]
lrwx------ 1 user user 64 Mar 24 00:05 7 -> socket:[3142930]
lrwx------ 1 user user 64 Mar 24 00:05 8 -> socket:[3142932]
lr-x------ 1 user user 64 Mar 24 00:05 9 -> pipe:[9837788]
就像第一行:6839。这个数字代表什么?
答案1
这就是索引节点相关管道或插座的编号。
管道是一个单向通道,有写端和读端。在您的示例中,看起来 FD 5 和 FD 6 正在相互通信,因为 inode 编号相同。 (但也许不是。见下文。)
比看到一个程序通过管道与自身对话更常见的是一对单独的程序相互对话,通常是因为您使用 shell 在它们之间设置了一个管道:
shell-1$ ls -lR / | less
然后在另一个终端窗口中:
shell-2$ ...find the ls and less PIDs with ps; say 4242 and 4243 for this example...
shell-2$ ls -l /proc/4242/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 1 -> pipe:[222536390]
shell-2$ ls -l /proc/4243/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 0 -> pipe:[222536390]
这表示 PID 4242 的标准输出(按照惯例,FD 1)连接到索引节点号为 222536390 的管道,并且 PID 4243 的标准输入(FD 0)连接到同一管道。
所有这些都是一种很长的说法,表示ls
的输出正在发送到less
的输入。
回到你的例子,FD 1 和 FD 2 几乎肯定是不是互相交谈。这很可能是将 stdout (FD 1) 和 stderr (FD 2) 绑定在一起的结果,因此它们都到达相同的目的地。您可以使用 Bourne shell 来做到这一点,如下所示:
$ some-program 2>&1 | some-other-program
因此,如果您在 中查看/proc/$PID_OF_SOME_OTHER_PROGRAM/fd
,您会发现附加到管道的第三个 FD 的索引节点号与附加到实例的 FD 1 和 2 的索引节点号相同some-program
。在您的示例中,FD 5 和 6 也可能发生这种情况,但我没有现成的理论来说明这两个 FD 是如何联系在一起的。您必须知道程序内部正在做什么才能弄清楚这一点。
答案2
/proc/net/tcp
对于套接字,您可以在、/proc/net/udp
或中找到有关 inode 的更多信息/proc/net/unix
。例如:
ls -l /proc/<pid>/fd
lrwx------ 1 root root 64 May 26 22:03 3 -> socket:[53710569]
我们看到 inode 是 53710569。
head -n1 < tcp ; grep -a 53710569 tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
155: 0100007F:001B 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 53710569 1 ffff88011f52c200 300 0 0 2 -1
在本例中,这是一个侦听套接字(无远程地址),侦听本地端口 27 (0x1B)。 IP 地址在“网络表示法”中为 4 个字节的十六进制,您可以使用inet_ntoa
函数将其转换为标准 abcd 表示法(在本例中为 127.0.0.1)。
请注意,这些文件看起来是 0 字节,但如果您阅读它们,它们是有内容的。另请注意-a
grep 需要它,因为它们可能(例如unix
)看起来是二进制的。