如何获取 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。如果此实用程序无法向您显示有关所需套接字的信息,那么什么也做不到。
我正在尝试查找给定进程的所有 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。如果此实用程序无法向您显示有关所需套接字的信息,那么什么也做不到。