find一个Linux套接字的原始拥有过程

在Linux和其他类UNIX操作系统中,两个(或更多)进程共享Internet套接字是可能的。 假设进程之间没有父子关系,有什么办法可以告诉哪个进程最初创build了一个套接字?

澄清:我需要从“外部”使用/proc文件系统或类似的进程来确定。 我无法修改这些进程的代码。 我已经可以通过读取/proc/<pid>/fd来告诉哪些进程正在共享套接字,但是这并不告诉我最初创build它们的过程。

Solutions Collecting From Web of "find一个Linux套接字的原始拥有过程"

你可以使用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 - 

不是'lsof -Ua'的帮助?

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

您需要找到套接字(可能是通过IP地址/端口号?)并解析出inode号码。 一旦你有了inode,你可以搜索所有/proc/*/fd/* ,为每个链接调用stat并检查struct statst_ino成员,直到找到一个匹配。

inode号码应该在两个进程之间匹配,所以当你经历了所有的/proc/*/fd/*你应该找到它们。

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

我不知道如何使用sendmsg()将套接字从一个进程“发送”到另一个进程。

我知道如果第二个进程尝试使用相同的端口,则bind()系统调用将返回EADDRINUSE。