c - 为什么打开的文件描述符没有被重用,而是在数值上增加
问题描述
我有一个简单的 C HTTP 服务器。我关闭了磁盘文件的文件描述符和fd
由返回的新连接accept(...)
,但我注意到我得到的新文件描述符编号比以前的数字大:例如,接受返回的文件描述符从 4 开始,然后是 5,然后又是 4依此类推,直到文件描述符达到系统上的最大打开文件描述符。
我已10,000
在我的系统上将值设置为,但我不确定为什么文件描述符编号会跳转到最大值。而且我有点确定我的程序正在关闭文件描述符。
所以我想知道如果没有数千个连接,那么文件描述符新数字是如何周期性增加的:在大约 24 小时内我收到 message accept: too many open files
。这是什么信息?
另外,ulimit -n number
值是否会在不重新启动系统的情况下自动重置?
如答案中所述。的输出_2$ ps aux | grep lh
是
dr-x------ 2 fawad fawad 0 Oct 11 11:15 .
dr-xr-xr-x 9 fawad fawad 0 Oct 11 11:15 ..
lrwx------ 1 fawad fawad 64 Oct 11 11:15 0 -> /dev/pts/3
lrwx------ 1 fawad fawad 64 Oct 11 11:15 1 -> /dev/pts/3
lrwx------ 1 fawad fawad 64 Oct 11 11:15 2 -> /dev/pts/3
lrwx------ 1 fawad fawad 64 Oct 11 11:25 255 -> /dev/pts/3
的输出ls -la /proc/$$/fd
是
root 49855 0.5 5.4 4930756 322328 ? Sl Oct09 15:58 /usr/share/atom/atom --executed-from=/home/fawad/Desktop/C++-work/lhparse --pid=49844 --no-sandbox
root 80901 0.0 0.0 25360 5952 pts/4 S+ 09:32 0:00 sudo ./lh
root 80902 0.0 0.0 1100852 2812 pts/4 S+ 09:32 0:00 ./lh
fawad 83419 0.0 0.0 19976 916 pts/3 S+ 11:27 0:00 grep --color=auto lh
我想知道什么是 pts/4 等列。这是文件描述符编号吗?
解决方案
文件描述符所代表的套接字很可能处于 close_wait 或 time_wait 状态。这意味着 TCP 堆栈将 fd 保持打开的时间更长一点。因此,在这种情况下,您将无法立即重用它。
一旦套接字完全完成并关闭,文件描述符编号就可以在您的程序中重用。
见:https ://en.m.wikipedia.org/wiki/Transmission_Control_Protocol
协议操作,特别是等待状态。
要查看哪些文件仍处于打开状态,您可以运行
ls -la /proc/$$/fd
这个输出也将有所帮助。
ss -tan | head -5
LISTEN 0 511 *:80 *:*
SYN-RECV 0 0 192.0.2.145:80 203.0.113.5:35449
SYN-RECV 0 0 192.0.2.145:80 203.0.113.27:53599
ESTAB 0 0 192.0.2.145:80 203.0.113.27:33605
TIME-WAIT 0 0 192.0.2.145:80 203.0.113.47:50685
推荐阅读
- angular - 如何在 Angular 7 中使用 GET 传递多选数据
- unity3d - 如何在 Unity 中为 3D“飞行”敌人创建 NavMeshAgent Pathfinder
- haskell - Haskell Newbie - 发生检查:无法构造无限类型:a ~ [a]
- swift - Facebook Graph API:Swift SDK 不工作:GraphRequest
- python-3.x - 我们如何通过增加索引来增加列表的元素?
- javascript - 如何在多部分/表单数据请求中发送对象而不在 Angular 中转换为字符串
- c# - XmlReader 创建空字符串 C#
- r - 如何确定列中并非全部相同的重复行?
- c# - 在 Unity 中创建颜色循环效果?
- python - 如何在python的二进制矩阵中跟踪1的所有唯一路径?