当前位置:  开发笔记 > 编程语言 > 正文

如何在不使用lsof或netstat的情况下将网络连接绑定到PID?

如何解决《如何在不使用lsof或netstat的情况下将网络连接绑定到PID?》经验,为你挑选了2个好方法。

有没有办法将网络连接绑定到PID(进程ID)而不需要lsof或netstat?

目前lsof用于轮询哪些连接属于哪个进程ID.但是lsof或netstat在繁忙的主机上可能非常昂贵,并且希望避免分叉到这些工具.

有没有类似于/ proc/$ pid的地方可以找到这些信息?我通过检查/ proc/net知道网络连接是什么,但无法弄清楚如何将其绑定到pid.在/ proc/$ pid中,似乎没有任何网络信息.

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

补充说明:

我想强调这里的目标是将网络连接绑定到PID.获得一个或另一个是微不足道的,但是以低成本的方式将两者结合在一起似乎很困难.感谢到目前为止的答案!



1> 8jean..:

我不知道您需要多长时间进行一次轮询,或者您对"昂贵"的意思是什么,但是使用正确的选项netstat并且lsof运行速度比默认配置快得多.
例子:

netstat -ltn

仅显示l istening t cp套接字,并省略默认启用的(慢)n ame分辨率.

lsof -b -n -i4tcp:80

省略所有b锁定操作,n ame解析,并限制端口80上IPv4 tcp套接字的选择.



2> Martin Carpe..:

在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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有