【发布时间】:2016-08-07 04:02:26
【问题描述】:
我正在尝试查找给定进程的所有 TCP 套接字 的文件描述符,即。给定它的 pid,这样我就可以在另一个进程中获取套接字选项,而无需修改原始进程。
例如,如果我知道文件描述符是fd,那么我希望调用getsockopt(fd, ...) 在另一个进程中检索选项。我想知道这是可行的吗?如果是这样,如何在原始流程之外获得我需要的fd?
我尝试在创建套接字时打印出返回值,即。 s = socket(...); printf("%d\n", s);,保持原始进程运行并在其他地方调用getsockopt(s, ...),但它不起作用 - 似乎这样的返回值是依赖于进程的。
我也找到了the solution with unix domain sockets,但我不想修改原流程的代码。
至于直接阅读\proc\<PID>\fd 或利用lsof,我想说我不知道如何从他们那里找到我需要的东西。我的直觉是它们可能是潜在的解决方案。
当然也欢迎任何其他想法。说实话,我对Linux中的文件描述符机制不是很熟悉。
【问题讨论】:
-
文件描述符是特定于进程的。例如。 0 = 标准输入 1 = 标准输出和 2 = 标准错误。因此,在每个进程中打开的第一个套接字或文件将获得 3 或更多的 fd。
-
你还没有解释究竟你想要弄清楚的是什么。您要查找哪些
lsof或ss无法提供的信息? -
@JonathonReinhart 我想从另一个进程中获取套接字选项。因此,我希望以某种方式通过
lsof或任何其他命令检索 fd。 -
哪个套接字选项?同样,文件描述符只是一个整数。它本身是无用的。我不明白你为什么不确切地解释你想要做什么。
-
这个answer 提到了可能提供从进程中提取套接字相关信息的方法的systemtap。
标签: c linux sockets tcp file-descriptor