如何找到有关文件描述符的更多信息?

How to find more information about the file descriptor?

我正在尝试调试挂起的进程,进程 ID 的 strace 输出有最后一行:
recvfrom(9, <detached ...> 据此我了解到该进程正在等待套接字。

但是我不知道这是什么插座。我怎样才能发现更多关于这个的信息?文件描述符 9 会给我更多信息吗?我怎样才能使用这个文件 discover 来更多地了解它在等待什么?

它是一个 python 进程,运行 在 linux。

查看前面的 strace 输出,了解文件描述符何时从 open()(或者可能 socket())返回,您会看到调用中使用的附加参数.

由于您使用的是 strace,我假设您使用的是 Linux 并且您知道进程 ID。在这种情况下,您可以在 /proc 中找到很多信息。这是一个操作示例。

ls -l /proc/<pid>/fd。将有一个条目对应于您感兴趣的 fd,并且 fd 应该是这样的套接字:

$ ls -l /proc/3311/fd
total 0
lrwx------ 1 alanau alanau 64 Sep 24 20:37 0 -> /dev/pts/0
lrwx------ 1 alanau alanau 64 Sep 24 20:37 1 -> /dev/pts/0
lrwx------ 1 alanau alanau 64 Sep 24 20:37 2 -> /dev/pts/0
lrwx------ 1 alanau alanau 64 Sep 24 20:37 3 -> socket:[23182]

在上面的示例中,3 是感兴趣的套接字。 socket后面的数字是inode号,在本例中是23182

现在查看文件 /proc/net/tcp 以找到 inode:

$ cat /proc/net/tcp | grep 23182
   2: 0F02000A:C43B 8EDC3AD8:0050 01 00000000:00000000 00:00000000 00000000  1000        0 **23182** 1 0000000000000000 23 0 0 10 -1

第一行/proc/net/tcp告诉你每个字段代表什么:

 sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode

所以在这个例子中,远程地址是8EDC3AD8:0050。这是十六进制和网络字节顺序中的 ip_addres:port_number。如果将其转换为十进制,则为 216.58.220.142:80.

这告诉你它实际上是到 google.com!

端口 80 的 TCP 连接

如果您在 /proc/net/tcp 中找不到 inode 编号,请尝试目录中的其他协议,可能是 /proc/net/udp