【问题标题】:How to get the file descriptors of TCP socket for a given process in Linux?如何获取Linux中给定进程的TCP套接字的文件描述符?
【发布时间】: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。
  • 你还没有解释究竟你想要弄清楚的是什么。您要查找哪些lsofss 无法提供的信息?
  • @JonathonReinhart 我想从另一个进程中获取套接字选项。因此,我希望以某种方式通过lsof 或任何其他命令检索 fd。
  • 哪个套接字选项?同样,文件描述符只是一个整数。它本身是无用的。我不明白你为什么不确切地解释你想要做什么。
  • 这个answer 提到了可能提供从进程中提取套接字相关信息的方法的systemtap。

标签: c linux sockets tcp file-descriptor


【解决方案1】:

没有。你根本无法做到你所要求的。

文件描述符只是一个整数,但它指的是在给定进程中打开的文件对象。另一个进程中的整数值指的是不同的、可能未打开的文件对象。

在不涉及ptrace 调试API 或远程代码注入的情况下,您仅限于内核通过/proc 向您公开的内容。

查看man page for ss。如果此实用程序无法向您显示有关您想要的套接字的信息,那么什么都不能。

【讨论】:

  • 那么内核是否像/proc 的全局fd 一样暴露某事?
  • "global fd" 没有这样的东西。它们是每个进程/proc/<pid>/fd 将向您显示进程已打开的文件描述符。
  • 谢谢!那么是否可以访问另一个进程打开的文件对象?我认为这个文件对象一定存在于某个地方。
  • 如果可以按照您的要求进行操作,那将是一个巨大的安全漏洞。无需将代码注入其他进程,或编写自定义内核模块,就不会。您无法访问该文件描述符。期间。
  • 好的,我明白了。非常感谢你!我会从内核方面寻找其他方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2014-04-25
  • 2020-05-01
  • 2015-03-16
相关资源
最近更新 更多