我有一个简单的C HTTP服务器。我关闭了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而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等栏目。这是文件描述符号吗。
发布于 2021-10-11 05:31:47
文件描述符表示的套接字很可能处于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:50685https://stackoverflow.com/questions/69521315
复制相似问题