你的方法有很多误解.我将逐一介绍它们.
>套接字与特定进程无关.创建套接字时,其引用计数为1.但是通过不同的方法(如dup2,fork和文件描述符)传递可以创建对同一套接字的许多引用,从而导致其引用计数增加.其中一些引用可以来自一个打开的文件描述符表,它本身可以被许多线程使用.这些线程可能属于同一个线程组(PID)或不同的线程组.当您对netstat使用-p标志时,它将枚举每个进程可访问的套接字,并尝试为每个已知套接字查找进程.如果有多个候选流程,则无法保证它会显示您感兴趣的流程.
> / 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 / tcp和/ proc / net / tcp6,因为/ proc / net是/ proc / self / net的符号链接.