我正在实现代码来获取所有网络连接并将它们与使用它们的 PID 关联起来。
比如说,对于 tcp4,对于每个 pid,我列出/proc/pid/fd
,在那里搜索套接字的链接,读取它们的索引节点号并查找它们以/proc/net/tcp
获取有关连接的详细信息。
但是,如果我查找 inode 编号,/proc/net/tcp
我会得到较少的连接比我在 中查找它们要好/proc/[pid]/net/tcp
。例如,如果我在依赖时执行上述过程/proc/net/tcp
,我只能看到浏览器打开的套接字,而如果我依赖/proc/[pid]/net/tcp
,我可以看到我的兄弟和“java”进程有打开的连接。
那么我应该依靠/proc/net/tcp
还是/proc/[pid]/net/tcp
为了这个目的呢?我很困惑,因为 psutil 是 Python 中广泛使用的包,/proc/net/tcp
一方面正在使用,但如果我不看/proc/[pid]/net/tcp
.
答案1
/proc/net
是 的符号链接/proc/self/net
,因此仅当进程和检查的进程处于不同的状态时/proc/net
和 才/proc/[pid]/net
不同[pid]
/proc/net
网络命名空间。
如果您想列出所有套接字,则必须查看所有名称空间;对于同一网络命名空间中的两个进程,它们/proc/PID/ns/net
将具有相同的索引节点号。这样您就可以枚举系统上所有不同的网络名称空间。