如何获取 Linux 中给定进程的 TCP 套接字文件描述符?

How to get the file descriptors of TCP socket for a given process in Linux?

我正在尝试查找给定进程的所有 TCP 套接字 的文件描述符,即。给定它的 pid,这样我就可以在另一个进程中获取套接字选项而无需修改原始进程。

例如,如果我知道文件描述符是fd,那么我希望在另一个进程调用getsockopt(fd, ...)来检索选项。我想知道这是可行的吗?如果是这样,如何在原始过程之外获得我需要的fd

我试图在创建套接字时打印出 return 值,即。 s = socket(...); printf("%d\n", s);,保留原始过程 运行 并在其他地方调用 getsockopt(s, ...) 但它不起作用 - 似乎这样的 return 值是过程相关的。

我也找到了the solution with unix domain sockets但是我不想修改原来流程的代码

至于直接阅读\proc\<PID>\fd还是利用lsof,我想说我不知道​​如何从他们那里找到我需要的东西。我的直觉是它们可能是潜在的解决方案。

当然也欢迎任何其他想法。说实话,我对Linux.

中的文件描述符机制不是很熟悉

没有。你根本做不到你要求的。

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

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

向您公开的内容

查看 man page for ss。如果此实用程序无法向您显示有关所需套接字的信息,那么什么也做不到。