如何将networking连接绑定到PID而不使用lsof或netstat?

有没有办法将networking连接绑定到一个PID(进程ID),而不分叉到LSF或NETSTAT?

目前正在使用lsof来查询哪个连接属于哪个进程ID。 但是,在繁忙的主机上,lsof或netstat可能会相当昂贵,并且希望避免必须分叉这些工具。

有没有类似于/ proc / $ pid的地方可以find这些信息? 我通过检查/ proc / net知道networking连接是什么,但是无法弄清楚如何将它连接到一个pid。 在/ proc / $ pid中,似乎没有任何networking信息。

目标主机是Linux 2.4和Solaris 8到10.如果可能的话,在Perl中有一个解决scheme,但愿意做C / C ++。

补充笔记:

我想强调这里的目标是将一个networking连接绑定到一个PID。 find一个或那个是微不足道的,但以低成本的方式将两者结合在一起似乎是困难的。 感谢迄今为止的答案!

我不知道你需要多长时间进行一次轮询,或者你的意思是“昂贵”,但是选择正确的选项, netstatlsof运行速度比默认配置快很多。
例子:

 netstat -ltn 

只显示出来,并省略默认打开的(缓慢)分辨率。

 lsof -b -n -i4tcp:80 

省略所有b锁定操作,并将选择限制在端口80上的IPv4 tcp套接字。

在Solaris上,您可以使用pfiles(1)来执行此操作:

 # ps -fp 308 UID PID PPID C STIME TTY TIME CMD root 308 255 0 22:44:07 ? 0:00 /usr/lib/ssh/sshd # pfiles 308 | egrep 'S_IFSOCK|sockname: ' 6: S_IFSOCK mode:0666 dev:326,0 ino:3255 uid:0 gid:0 size:0 sockname: AF_INET 192.168.1.30 port: 22 

对于Linux,这是更复杂(可怕):

 # pgrep sshd 3155 # ls -l /proc/3155/fd | fgrep socket lrwx------ 1 root root 64 May 22 23:04 3 -> socket:[7529] # fgrep 7529 /proc/3155/net/tcp 6: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7529 1 f5baa8a0 300 0 0 2 -1 

00000000:00160.0.0.0:22 。 这是netstat -a的等效输出:

 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 

你为什么不看netstat的源代码,看看它是如何得到的信息? 它是开源的。

对于Linux,看看/proc/net目录(例如, cat /proc/net/tcp列出了你的tcp连接)。 不确定Solaris。

这里有更多的信息。

我猜netstat基本上使用这个完全相同的信息,所以我不知道你是否能够加快它的一大堆。 请务必尝试使用netstat'-an'标志来实时解析ip-adress到主机名(由于dns查询,这可能需要很长时间)。

最简单的事情是

 strace -f netstat -na 

在Linux上(我不知道Solaris)。 这会给你一个所有系统调用的日志。 这是很多的输出,其中一些将是相关的。 看看它打开的/ proc文件系统中的文件。 这应该引导你如何netstat做到这一点。 不寻常的是,ltrace会允许你通过c库做同样的事情。 在这种情况下对你没有用处,但在其他情况下可能有用。

如果不清楚的话,请看一下源代码。

看看这些答案,彻底探索可用的选项:

  • 我如何获得与打开它们的应用程序相关的端口?
  • 如何做“netstat -p”,但速度更快?