我正在尝试查找给定进程的所有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中的文件描述符机制。
文件描述符是特定于进程的。例如。 0 =标准输入1 =标准输出和2 =标准错误。因此,在每个进程中打开的第一个套接字或文件将获得3个或更多的fd。 –
你还没有解释到底是你究竟想要弄清楚什么。你在寻找那个'lsof'或'ss'不能提供什么信息? –
@JonathonReinhart我想从另一个进程获取套接字选项。因此,我希望以某种方式通过'lsof'或任何其他命令检索fd。 – zzy