/proc/PID/fd/X 链接号

Tha*_*tos 39 linux pipe open-files proc socket

在 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]
Run Code Online (Sandbox Code Playgroud)

比如第一行:6839。那个数字代表什么?

War*_*ung 40

这是有问题的管道或套接字的inode编号。

管道是单向通道,具有写端和读端。在您的示例中,看起来 FD 5 和 FD 6 正在相互交谈,因为 inode 编号相同。(也许不是,但见下文。)

比看到程序通过管道与自身对话更常见的是一对单独的程序彼此对话,通常是因为您在它们之间设置了一个管道:

shell-1$ ls -lR / | less
Run Code Online (Sandbox Code Playgroud)

然后在另一个终端窗口中:

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]
Run Code Online (Sandbox Code Playgroud)

这表示 PID 4242 的标准输出(FD 1,按照惯例)连接到 inode 编号为 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
Run Code Online (Sandbox Code Playgroud)

因此,如果您在 中/proc/$PID_OF_SOME_OTHER_PROGRAM/fd查看,您会发现第三个 FD 连接到管道,其 inode 编号与连接到some-program实例的FD 1 和 2 的 inode 编号相同。在您的示例中,这也可能是 FD 5 和 6 发生的情况,但我没有现成的理论这两个 FD 是如何联系在一起的。你必须知道程序在内部做什么才能弄清楚。

  • 是的。在 `/proc` 文件系统的情况下,inode 编号只是在运行中组成(参见内核中 `fs/inode.c` 中的 `get_next_ino()`),当系统刚启动时从 0 开始。组成它们的机制由几个 Linux 的非持久文件系统(proc、configfs、ramfs、autofs...)共享,其中 inode 编号*是*唯一的,即使 POSIX 语义不要求它。然而,这是一个相当特殊的情况。您所谈论的规则通常与 ext3 等普通持久性文件系统相关联。 (4认同)

Mar*_*555 32

对于套接字,您可以在/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]
Run Code Online (Sandbox Code Playgroud)

我们看到 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
Run Code Online (Sandbox Code Playgroud)

在本例中,这是一个侦听套接字(无远程地址),侦听本地端口 27 (0x1B)。IP 地址在“网络表示法”中是 4 个十六进制字节,您可以使用inet_ntoa函数将其转换为标准 abcd 表示法(在这种情况下为 127.0.0.1)。

请注意,这些文件看起来是 0 字节,但如果您阅读它们,则它们有内容。另请注意,-agrep 需要它,因为它们可能(例如 with unix)看起来是二进制的。