找到Linux套接字的原始拥有进程

Rob*_*b H 16 c sockets linux

在Linux和其他类UNIX操作系统,它是可能的两个(或多个)进程共享一个互联网插座.假设进程之间没有父子关系,有没有办法告诉最初创建套接字的进程是什么?

澄清:我需要使用/proc文件系统或类似工具从"外部"确定这一点.我无法修改进程的代码.我已经可以通过阅读告诉哪些进程正在共享套接字/proc/<pid>/fd,但这并不能告诉我最初创建它们的进程.

who*_*isp 21

你可以使用netstat.您应该查看"本地地址"和"PID /程序名称"列.

xxx@xxx:~$ netstat -tulpen
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
tcp        0      0 127.0.0.1:4005          0.0.0.0:*               LISTEN      1000       68449       7559/sbcl       
tcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN      0          3938        -               
tcp6       0      0 :::6000                 :::*                    LISTEN      0          3937        -               
udp        0      0 0.0.0.0:68              0.0.0.0:*                           0          4528        -               
Run Code Online (Sandbox Code Playgroud)


小智 7

不会'帮助'-Ua'吗?


nos*_*nos 5

您可能可以通过解析 /proc/net/tcp(以及其他协议的类似“文件”)来找到共享套接字。有上的/ proc /净/ TCP一些文档在这里

您需要找到套接字(可能通过其 IP 地址/端口号?)并解析出 inode 号。拥有 inode 后,您可以搜索所有/proc/*/fd/*,调用stat每个链接并检查 的 st_ino成员,struct stat直到找到匹配项。

两个进程之间的 inode 编号应该匹配,因此当您完成所有操作后,/proc/*/fd/*您应该都找到了它们。

如果您知道的是第一个的进程 ID 和套接字 fd,则您可能不需要通过 /proc/net/tcp,您需要做的就是统计/proc/<pid>/fd/<fd>并搜索其余部分以/proc/*/fd/*查找匹配的 inode。如果你想获取 IP 地址/端口号,你需要 /proc/net/tcp - 如果你知道 inode 号,你可以找到它