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

时间:2015-09-24 10:30:35

标签: python c file-descriptor

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

但我不知道这是什么类型的插座。我怎样才能发现更多这方面的内容?文件描述符9会给我更多信息吗?如何使用此文件发现了解更多有关它的内容?

它是一个在Linux中运行的python进程。

2 个答案:

答案 0 :(得分:1)

strace输出中查看从open()(或者socket())返回文件描述符的时间,您将看到调用中使用的其他参数。 / p>

答案 1 :(得分:1)

由于您使用的是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