首页 > 解决方案 > 为什么打开的文件描述符没有被重用,而是在数值上增加

问题描述

我有一个简单的 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 等列。这是文件描述符编号吗?

标签: clinuxsocketsubuntu

解决方案


文件描述符所代表的套接字很可能处于 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

推荐阅读