yas*_*ash 2 shell networking c socket
我一直在运行一个 C 程序,它偶尔会连接到 Redis 数据库。运行程序几个小时后,它显示“无法创建套接字:打开的文件太多”。我非常确定每次完成数据库中的逻辑部分后我都会关闭连接。所以我想知道是否有任何方法可以知道 C 程序在运行时创建了多少个套接字?我使用的是 Ubuntu 16.04。
您没有指定操作系统,并且/proc/*/fd/并不存在于所有操作系统上。
实际上,您需要列出该进程当前打开的所有文件描述符,从中您可以确定实际泄漏的内容。泄漏的不一定是套接字文件描述符。
…及其各种衍生产品(例如 TrueOS、DragonFly BSD)。
使用fstat带有-p选项和相关进程 ID 的命令:
fstat -p 718
fstat。NetBSD 通用命令手册。2013年12月15日。类似地使用该procfiles命令,并带有-n打印名称的选项:
procfiles-n 6679
procfiles。AIX 7.2。IBM 知识中心。……因此,关于 Illumos、Schilix 等人。
使用pfiles命令:
pfiles 13253
pfiles。 用户命令。SunOS 10.5 手册。2008年12月10日。类似地使用lsof命令:
lsof -p 41467
在我的 C++ 程序中,一个拥有文件描述符并在其析构函数中关闭它的简单类会产生奇迹。不幸的是,您必须求助于 GNU 特定的语言扩展(即__attribute__(__cleanup__))才能在 C 程序中实现这一点。
您当然可以使用其他工具更进一步。使用 DTrace 和合适的脚本,您可以在打开和关闭文件描述符时监视进程。(您也可以使用truss、 或ktrace或来执行此strace操作;尽管它们选择所进行的系统调用子集的机制要么相当基本,要么根本不存在。您也可以使用调试器和一些合适的断点来执行此操作。)
| 归档时间: |
|
| 查看次数: |
2502 次 |
| 最近记录: |