gpt4 book ai didi

linux - 识别 unix 域套接字连接的另一端

转载 作者:IT王子 更新时间:2023-10-29 00:20:41 25 4
gpt4 key购买 nike

我试图弄清楚哪个进程正在占用 unix 域套接字的另一端。在一些 strace 输出中,我已经确定了一个给定的文件描述符,它涉及我当前正在调试的问题,我想知道哪个进程在它的另一端。由于有多个连接到该套接字,因此仅通过路径名是行不通的。

lsof 为我提供了以下信息:

dbus-daem  4175  mvg   10u  unix 0xffff8803e256d9c0      0t0  12828 @/tmp/dbus-LyGToFzlcG

所以我知道一些地址(“内核地址”?),我知道一些套接字号,我知道路径。我可以在其他地方找到相同的信息:

$ netstat -n | grep 12828
unix 3 [ ] STREAM CONNECTED 12828 @/tmp/dbus-LyGToFzlcG
$ grep -E '12828|ffff8803e256d9c0' /proc/net/unix
ffff8803e256d9c0: 00000003 00000000 00000000 0001 03 12828 @/tmp/dbus-LyGToFzlcG
$ ls -l /proc/*/fd/* 2>/dev/null | grep 12828
lrwx------ 1 mvg users 64 10. Aug 09:08 /proc/4175/fd/10 -> socket:[12828]

但是,这些都没有告诉我套接字连接的其他 端是什么。我如何知道哪个进程控制着另一端?

最佳答案

Server Fault 上也有人问过类似的问题和 Unix & Linux .公认的答案是此信息无法可靠地提供给 Linux 上的用户空间。

一个常见的建议是查看相邻的套接字编号,但是 ls -l/proc/*/fd/* 2>/dev/null | grep 1282[79] 在这里没有给出结果。或许可以使用 netstat 输出中的相邻行。似乎有一种连接模式,有和没有关联的套接字名称。但我想要某种确定性,而不仅仅是猜测。

One answer建议使用一种工具,该工具似乎能够通过挖掘内核结构来解决此问题。使用该选项需要内核的调试信息,由 CONFIG_DEBUG_INFO 选项生成,并由某些发行版作为单独的包提供。基于该答案,使用 lsof 提供的地址,以下解决方案对我有用:

# gdb /usr/src/linux/vmlinux /proc/kcore
(gdb) p ((struct unix_sock*)0xffff8803e256d9c0)->peer

这将打印连接另一端的地址。 Grepping lsof -U 将提供进程 ID 和文件描述符编号等详细信息。

如果调试信息不​​可用,可能可以通过了解对等成员在 unix_sock 结构中的偏移来访问所需的信息。在我的例子中,在 x86_64 的 Linux 3.5.0 上,可以使用以下代码计算相同的地址,而无需依赖调试符号:

(gdb) p ((void**)0xffff8803e256d9c0)[0x52]

我不会对该解决方案的可移植性做出任何保证。

关于linux - 识别 unix 域套接字连接的另一端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11897662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com