/ proc / PID / fd / X链接号


36

在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。该数字代表什么?

Answers:


36

那是有问题的管道或插座的索引节点号。

管道是具有写端和读端的单向通道。在您的示例中,由于inode编号相同,因此FD 5和FD 6似乎正在互相通信。(不过,也许不是。请参阅下文。)

与看到一个程序通过管道相互通信相比,更常见的是一对相互独立的程序,通常是因为您使用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连接到管道,该管道的inode编号与some-program实例的FD 1和FD 2相同。您的示例中的FD 5和FD 6也可能正在发生这种情况,但是我尚无理论将这两个FD如何绑在一起。您必须知道程序内部在做什么才能弄清楚。


1
我认为这个例子是pidgin-它有很多管道,插座和其他东西,因此是一个很好的例子。最后一个问题:索引节点仅在特定文件系统的上下文中特定,对吗?如图所示,我可以在/文件系统上拥有索引节点3,在文件系统上具有另一个(不同的)索引节点3 /boot
Thanatos

4
是。在的情况下,/proc文件系统,inode编号只是由上飞(见get_next_ino()fs/inode.c在内核),从0开始,当系统刚启动的。组成它们的机制由Linux的多个非连续文件系统(proc,configfs,ramfs,autofs ...)共享,其中,即使POSIX语义不需要它,inode编号也是唯一的。但是,这是一个非常特殊的情况。您所谈论的规则通常是与ext3之类的普通持久性文件系统结合使用的。
沃伦·杨

33

对于插座,你可以找到关于在inode的更多信息/proc/net/tcp/proc/net/udp/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)可能看起来是二进制的。


还有/proc/net/tcp6/proc/net/udp6使用IPv6。
克雷格·麦昆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.