【问题标题】:How do I find the file name associated with a socket descriptor?如何找到与套接字描述符关联的文件名?
【发布时间】:2024-05-20 18:15:02
【问题描述】:

当我想查看使用ls -l /proc/pid/fd 的进程的打开文件列表时,我看到了一些套接字描述符。如何找到相应的文件名?

lr-x------ 1 u1 users 64 Sep 15 14:45 0 -> /dev/null
lrwx------ 1 u1 users 64 Sep 15 14:45 1 -> /dev/pts/3
lrwx------ 1 u1 users 64 Sep 15 14:45 10 -> socket:[507942]
l-wx------ 1 u1 users 64 Sep 15 14:45 2 -> pipe:[505993]
l-wx------ 1 u1 users 64 Sep 15 14:45 22 -> pipe:[505994]
l-wx------ 1 u1 users 64 Sep 15 14:45 3 -> /dev/null
lrwx------ 1 u1 users 64 Sep 15 14:45 4 -> socket:[507938]
lrwx------ 1 u1 users 64 Sep 15 14:45 5 -> socket:[507939]
lrwx------ 1 u1 users 64 Sep 15 14:45 6 -> socket:[486323]
lrwx------ 1 u1 users 64 Sep 15 14:45 7 -> socket:[486324]
lrwx------ 1 u1 users 64 Sep 15 14:45 8 -> socket:[509999]
lrwx------ 1 u1 users 64 Sep 15 14:45 9 -> socket:[507941]

lsof -p pid 我也看到了套接字。

atIcoFoam 24376 u1  0r   CHR                1,3      0t0     1029 /dev/null
atIcoFoam 24376 u1  1u   CHR              136,3      0t0        6 /dev/pts/3
atIcoFoam 24376 u1  2w  FIFO                0,8      0t0   506122 pipe
atIcoFoam 24376 u1  3w   CHR                1,3      0t0     1029 /dev/null
atIcoFoam 24376 u1  4u  unix 0x0000000000000000      0t0   511127 socket
atIcoFoam 24376 u1  5u  unix 0x0000000000000000      0t0   511128 socket
atIcoFoam 24376 u1  6u  IPv4             510153      0t0      TCP *:37340 (LISTEN)
atIcoFoam 24376 u1  7u  IPv6             510154      0t0      TCP *:43305 (LISTEN)
atIcoFoam 24376 u1  8u  IPv4             512654      0t0      TCP hpclab.ws05:57696->hpclab.ws05:33141 (ESTABLISHED)
atIcoFoam 24376 u1  9u  IPv4             508030      0t0      TCP *:1027 (LISTEN)
atIcoFoam 24376 u1  10u  IPv6             508031      0t0      TCP *:1027 (LISTEN)

【问题讨论】:

  • 套接字并不总是有各自的文件系统名称...
  • 那么我怎样才能找到文件名。没有办法吗?
  • 如果套接字没有文件名,则无法找到它。
  • 但是有一个文件,这个进程正在处理它

标签: linux sockets filenames


【解决方案1】:

只有命名的 UNIX 域名套接字(AF_UNIX 类型的套接字)有关联的文件。

更新:

使用此套接字的文件描述符的进程特定值将此类文件的名称链接到 /proc/<process id>/fd/ 目录。

所有其他套接字在文件系统中没有表示。

【讨论】:

  • 这只是意味着,您不会在文件系统中为每个套接字/proc/<pid>/fd 列表找到一个条目。 @mahmood
  • 那么如何跟踪文件名?
  • 对于没有AF_UNIX 套接字,您根本不能,因为没有 no 文件。对于AF_UNIX 套接字,/proc/<pid>/fd 中的相应条目将是指向它的链接。 @mahmood
  • 通过套接字监控流量tcpdumpwireshark 可能会有所帮助。 @mahmood
  • @mahmood,为什么说有IO操作无法追踪?
【解决方案2】:

您可以通过以下方式列出打开的文件:

lsof -p PID

【讨论】:

    【解决方案3】:

    这些是 UNIX 监听套接字吗?我认为是的,因为如果它们是其他任何东西,那么您的问题就没有意义了。

    lsof 通常能够解析套接字绑定到的文件系统名称:

    lsof -p pid
    

    【讨论】:

    • 你确定那些套接字是绑定名字的吗?您的示例中的文件描述符 4 和 5 很可能是使用 socketpair()... 创建的匿名 UNIX 套接字的两端...
    最近更新 更多