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 等列。这是文件描述符编号。
文件描述符表示的套接字很可能处于 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)
归档时间: |
|
查看次数: |
1011 次 |
最近记录: |