2016-08-07 18 views
-1

我正在尝试查找给定进程的所有TCP套接字的文件描述符,即。给它的PID,这样我就可以在另一个进程中获得套接字选项而不用修改原来的那个。如何在Linux中获取给定进程的TCP套接字的文件描述符?

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

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

我也发现the solution with unix domain sockets但我不想修改原始程序的代码。

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

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

+2

文件描述符是特定于进程的。例如。 0 =标准输入1 =标准输出和2 =标准错误。因此,在每个进程中打开的第一个套接字或文件将获得3个或更多的fd。 –

+0

你还没有解释到底是你究竟想要弄清楚什么。你在寻找那个'lsof'或'ss'不能提供什么信息? –

+0

@JonathonReinhart我想从另一个进程获取套接字选项。因此,我希望以某种方式通过'lsof'或任何其他命令检索fd。 – zzy

回答

2

不,你根本无法做你在问什么。

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

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

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

+0

内核也暴露在'/ proc'处吗? – zzy

+0

*“全球fd”*没有这样的事情。他们是***每个进程***。 '/ proc//fd'会显示进程打开的文件描述符。 –

+0

谢谢!那么是否有可能访问由另一个进程打开的文件对象?这个文件对象必须存在于我认为的地方。 – zzy

相关问题