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

Bun*_*bit 3 c python file-descriptor

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

但我不知道这是什么或什么样的插座。我如何才能发现更多相关信息?文件描述符 9 会给我更多信息吗?我如何使用此文件发现来了解有关它正在等待什么的更多信息?

它是一个Python进程,在Linux中运行。

kay*_*lum 7

由于您正在使用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]
Run Code Online (Sandbox Code Playgroud)

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

现在查看文件/proc/net/tcp以找到该索引节点:

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

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

 sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
Run Code Online (Sandbox Code Playgroud)

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

这告诉你它实际上是一个到 google.com 端口 80 的 TCP 连接!

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