为什么打开的文件描述符没有被重用,而是数值不断增加

Ale*_*lex 2 c sockets linux ubuntu

我有一个简单的 C HTTP 服务器。我关闭了磁盘文件的文件描述符和fd返回的新连接accept(...),但我注意到我得到的新文件描述符编号比以前的数字大:例如来自accept返回的文件描述符以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
Run Code Online (Sandbox Code Playgroud)

的输出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
Run Code Online (Sandbox Code Playgroud)

我想知道什么是 pts/4 等列。这是文件描述符编号。

Mat*_*att 5

文件描述符表示的套接字很可能处于 close_wait 或 time_wait 状态。这意味着 TCP 堆栈将 fd 保持打开状态的时间更长一些。因此,在这种情况下您将无法立即重用它。

一旦套接字完全完成并关闭,文件描述符编号将可在程序中重用。

请参阅: https: //en.m.wikipedia.org/wiki/Transmission_Control_Protocol

协议操作,特别是等待状态。

要查看哪些文件仍然打开,您可以运行

ls -la /proc/$$/fd
Run Code Online (Sandbox Code Playgroud)

这个输出也将有所帮助。

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
Run Code Online (Sandbox Code Playgroud)