Dim*_*ima 8 linux networking proc netstat
我正在尝试实现枚举每个进程的所有现有 TCP 连接的代码(类似于netstat -lptn)。我更喜欢自己实现它而不是依赖netstat. 为了做到这一点,我正在解析来自/proc/<PID>/net/tcp.
我看到许多 TCP 连接列在命令下/proc/<PID>/net/tcp但未按netstat -lptn命令列出。
例如,我看到/proc/1/net/tcp并/proc/2/net/tcp有几个 TCP 连接(在 Ubuntu 16 上尝试过)。据我了解,/proc/1/net/tcp与/sbin/init不应有任何 TCP 连接的进程有关。在/proc/2/net/tcp涉及kthreadd其中也应该不会有任何的TCP连接。
kas*_*erd 17
你的方法有很多误解。我会一一介绍。
dup2,fork和文件描述符通过它可以创建到同一插座导致它的引用计数增加许多引用。其中一些引用可以来自一个打开的文件描述符表,它本身可以被许多线程使用。这些线程可能属于同一个线程组 (PID) 或不同的线程组。当您使用该-p标志时,netstat它将枚举每个进程可访问的套接字并尝试为每个已知套接字找到一个进程。如果有多个候选进程,则不能保证它显示您感兴趣的进程。/proc/<PID>/net/tcp不仅列出与该进程相关的套接字。它列出了该进程所属的网络命名空间中的所有 TCPv4 套接字。在默认配置中,系统上的所有进程都属于单个网络命名空间,因此您将看到任何 PID 的相同结果。这也解释了为什么不使用网络的线程/进程在此文件中有内容。即使它本身不使用网络,它仍然属于其他进程可能使用网络的网络命名空间。/proc/<PID>/net/tcp包含侦听和连接的套接字。当你传递-l给netstat它时,它只会显示你正在监听的套接字。要更接近地匹配输出,您需要-a而不是-l./proc/<PID>/net/tcp仅包含 TCPv4 套接字。您还需要使用/proc/<PID>/net/tcp6以查看所有 TCP 套接字。如果您只对与您自己的进程位于同一命名空间中的套接字感兴趣,则无需遍历不同的 PID。您可以改为使用/proc/net/tcpand/proc/net/tcp6因为/proc/net是到/proc/self/net.