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

zzy*_*zzy 1 c sockets linux tcp file-descriptor

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

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

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

我也找到了 unix 域套接字的解决方案,但我不想修改原始进程的代码。

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

当然,也欢迎任何其他想法。说实话,我对Linux中的文件描述符机制不是很熟悉。

Jon*_*art 5

不,你根本无法做到你所要求的。

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

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

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