“ netstat -p”和“ lsof -n -i -P”似乎都重新链接了所有进程fd,例如stat / proc / * / fd / *.

如何更有效地做到这一点?

我的程序想知道正在连接什么进程.一次又一次遍历所有过程似乎效果不佳.

也建议使用iptables事物或内核补丁的方法.


解决方法:

看一下this answer,其中提到了执行套接字到进程映射的各种方法和程序.您还可以尝试其他几种技术来提高性能:

/proc中缓存文件描述符,在/ proc / net中缓存信息.这是通过链接的答案中提到的程序完成的,但是仅当您的过程持续几秒钟以上时才可行.
您可以尝试getpeername(),但这取决于您了解可能的端点以及它们映射到的进程.您的问题表明您正在本地连接套接字,您可以尝试使用Unix sockets,当通过将SO_PASSCRED传递给setsockopt()来交换消息时,它允许您接收对等方的凭据.看一下这些示例(它们很讨厌,但我能找到最好的).
http://www.lst.de/~okir/blackhats/node121.html
http://www.zanshu.com/ebook/44\_secure-programming-cookbook-for-c-and-cpp/0596003943\_secureprgckbk-chp-9-sect-8.html
查看Linux内核中的fs/proc/base.c.这是/ proc / PID / fd / FD中文件描述符上的readlink结果所给出的信息的核心.开销的重要部分是在VFS层上下传递请求,在提供给定信息的所有内核数据结构上发生的大量锁定,以及分别在内核和您端的stringyfying和destringyfying.您可能需要修改此文件中的某些代码来生成此信息,而无需许多中间层,尤其是将对每个进程的锁定最小化,或者对每次扫描的整个数据集仅进行一次锁定.

我个人的建议是暂时将其强行使用,理想情况下,以相反的数字顺序遍历/ proc中的过程,因为更新的过程和有趣的过程将具有更高的PID,并在找到结果后立即返回后.每个传入连接执行一次此操作相对便宜,这实际上取决于应用程序对性能的要求.您肯定会发现绕过调用netstat并直接从/ proc / net / PROTO解析新连接,然后在/ proc / PID / fd中找到套接字是值得的.如果所有流量都是本地主机,则只需切换到Unix套接字并直接获取凭据即可.编写一个新的syscall或proc模块,该模块转储有关我最后保存的文件描述符的大量数据.

标签: linux, netstat, process, sockets

相关文章推荐

添加新评论,含*的栏目为必填