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

时间:2016-08-07 04:02:26

标签: c linux sockets tcp file-descriptor

我正在尝试查找给定进程的所有 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中的文件描述符机制不是很熟悉。

1 个答案:

答案 0 :(得分:3)

没有。你根本无法做你想要的事。

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

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

查看man page for ss。如果此实用程序无法显示有关所需套接字的信息,则无法进行任何操作。