为什么打开的文件描述符没有得到重用,而是增加了数值

why open file descriptors are not getting reused instead they are increasing in number value

我有一个简单的 C HTTP 服务器。我关闭了由 accept(...) 编辑的磁盘文件和新连接 fds return 的文件描述符,但我注意到我得到的新文件描述符编号比之前的数字更大:例如来自 accept return 的文件描述符从 4 开始,然后是 5,然后又是 4,依此类推,直到文件描述符达到系统上最大打开文件描述符。

我已经在我的系统上将该值设置为 10,000 但我不确定为什么文件描述符编号会跳到最大值。而且我很确定我的程序正在关闭文件描述符。

所以我想知道如果没有数以千计的连接那么文件描述符的新数量为什么会周期性地增加:在大约 24 小时内我收到消息 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