可能有一些朋友想要做一些监视流量工具却不知道如何根据端口获取到进程的PID,如果你搜了一圈也没有找到满意的答案,希望我的这个文章可以帮到你。
1、获取当前活动的TCP/UDP端口值。
你会有许多方法获取此值,这里不多废话了。(我用的方法是通过raw socket进行抓包分析,你也可以用libpcap库实现)。假设当前我发现一个本地端口为54351的tcp端口。
当前状态:tcp_port/udp_port
2、获取端口的inode值。
假设你用自己的方法获取到了当前活动的tcp端口,此时你需要找到此端口对应的inode节点值。怎么获得呢?在这里/proc/net/tcp(对于udp是/proc/net/udp)。这个文件中存储的主要信息是:本地地址,本地端口,远程地址,远程端口,链接状态,发送队列,接收队列,UID,inode等信息。记住这个值,它就是我们需要的东西。
假设端口号为 54351 的记录中inode字段为 193738
当前状态:tcp_port/udp_port -> inode
3、遍历所有进程的所有fd(fd = 文件描述符)
在到/proc/目录你会看到很多以数字命名的文件夹,这些文件夹里就是系统当前运行进程的相关信息。文件名字这些数字就是进程的pid,比如叫做“1”的文件夹里就是init进程的相关信息。
假设我的google-chrome进程pid为102。我进入102目录(即当前我处在/proc/102/目录)后,能看到一个叫做fd的目录。进入fd目录。能看到很多用数字命名的文件,执行“ls -l”可以看到
niu@niu:/proc/102/fd$ ls -l
total 0
l-wx------ 1 niu niu 64 2011-11-29 10:41 31 -> pipe:[11903]
lr-x------ 1 niu niu 64 2011-11-29 10:41 32 -> /opt/google/chrome/chrome.pak
lrwx------ 1 niu niu 64 2011-11-29 10:41 33 -> anon_inode:[eventpoll]
lr-x------ 1 niu niu 64 2011-11-29 10:47 13 -> pipe:[8449]
l-wx------ 1 niu niu 64 2011-11-29 10:47 14 -> pipe:[8449]
lr-x------ 1 niu niu 64 2011-11-29 10:47 15 -> pipe:[8450]
l-wx------ 1 niu niu 64 2011-11-29 10:47 16 -> pipe:[8450]
lrwx------ 1 niu niu 64 2011-11-29 10:47 2 -> /dev/null
lrwx------ 1 niu niu 64 2011-11-29 10:47 3 -> anon_inode:[eventfd]
lr-x------ 1 niu niu 64 2011-11-29 10:47 4 -> pipe:[6952]
lrwx------ 1 niu niu 64 2011-11-29 10:47 7 -> /dev/null
lrwx------ 1 niu niu 64 2011-11-29 10:47 8 -> socket:[193738]
其中有一条为:
lrwx------ 1 niu niu 64 2011-11-29 10:47 8 -> socket:[193738]
方括号中的值就此进程占用的socket的inode值,
解析出此值与 前面获得到的193738比较可得出结论:54351端口属于进程102。
当前状态:tcp_port/udp_port -> inode == inode<-pid