This topic has been archived. It cannot be replied.
-
工作学习 / 学科技术讨论 / "Too many open files" 错误,请教Linux C 编程问题。我在Linux 下用C 写个SOCKET SERVER 程序, 每次处理一个SOCKET CLIENT的连接请求, 并发送数据给SOKCET CLIENT.
这个程序SOKCET SERVER 程序调用如下的一些系统函数:
1. 文件目录操作函数
fopen,fclose,fread, fseek,opendir, readdir, stat,closedir,chdir,
2. socket 操作函数
accept, read, write, close.
这个SOCKET SERVER 程序 运行了几天后, 就出现了 "Too many open files" 错误,我查了代码, 每次文件或SOCKET 打开用完后, 都调用了fclose 或close ,不清楚还有什么原因引起的这个错误。
-bobo123(以马内利);
2008-3-14
{484}
(#4330607@0)
-
好久没有C, 都快忘干净了. 1. fclose和close不一样, 关了socket并不能关文件; 2. 注意close的顺序, 如果先关了socket, 再关文件, 是不是就关不了了...
-youbet(信不信?);
2008-3-14
(#4331344@0)
-
用lsof查看
-dusk(~小桥流水~);
2008-3-14
(#4331372@0)
-
应为是tiny linux, 没有lsof这个命令
-bobo123(以马内利);
2008-3-17
(#4336159@0)
-
将你的程序放到有lsof, fuser机器上调试好了How to use lsof or fuser:
method 1: lsof | grep /mnt/disk [find process using that device]
Then you can try to kill the process
method 2: fuser -muv /mnt/disk [list the process using the file or socket]
-thunderbolt(孙悟空);
2008-6-23
{218}
(#4518184@0)
-
fork了么?
-frankwoo(柳五随风);
2008-3-16
(#4334477@0)
-
没有使用到线程, 整个主程序是在一个循环里, 侦听, 接受请求, 处理请求, 关闭SOCKET, 主要代码见内
-bobo123(以马内利);
2008-3-17
{1446}
(#4336209@0)
-
把这里面的东东贴出来看一下:process_client_request(request, new_sock)
-walacato(一天到晚游泳的鱼);
2008-3-19
(#4340856@0)
-
运行netstat 看看你的socket 处在什么状态。 另外你read from client部分有问题。你不能确保request 全部被读了。
-frankwoo(柳五随风);
2008-3-19
(#4342542@0)
-
你不能确保request 全部被读 - 这个应该不会导致too many file open.
-walacato(一天到晚游泳的鱼);
2008-3-19
(#4342614@0)
-
If there are un-read data in buffer, then FIN will be ignored. so if the client send the FIN first Server will never close it's socket.
-frankwoo(柳五随风);
2008-3-20
(#4343331@0)
-
and if the client code has the same Read/Write logic problem, then the FIN (close()) will be ignored by client, and the Server socket's will remain in FIN_WAIIT_2 states for ever.
-frankwoo(柳五随风);
2008-3-20
(#4343341@0)
-
另外我猜测你的server 上处理client 请求的socket们应该处在FIN_WAIT_2状态,如果是的话,修改你Server/Client部分的read/write部分
-frankwoo(柳五随风);
2008-3-19
(#4342549@0)
-
server 上的accept后的socket seems already closed correctly.
-walacato(一天到晚游泳的鱼);
2008-3-19
(#4342615@0)
-
so I suspect problem in function process_client_request().
-walacato(一天到晚游泳的鱼);
2008-3-19
(#4342618@0)
-
我感觉是socket部分有问题
-frankwoo(柳五随风);
2008-3-20
(#4343336@0)
-
how could you know they are closed? close() does not mean the SOCKET has been changed to CLOSED state.
-frankwoo(柳五随风);
2008-3-20
(#4343335@0)
-
increase value of maximum open files.The default vaule is 1024. you can increase the value.
ulimit -n : show 1024
increase the value in file /etc/security/limits.conf
item: nofile, ---follow instructions on comment lines.
-guest1(guest);
2008-3-16
{194}
(#4334914@0)
-
谢谢大家的回复,发现代码的有个地方使用到opendir, 用完后忘记使用closedir, 现在改过后的程序还在运行, 需等几天才能出结果。
-bobo123(以马内利);
2008-3-20
(#4344265@0)
-
编程风格有问题,这种成对使用的函数,一开始,就把写一对,省的后来忘了。
-googlebot(bot);
2008-3-20
(#4344340@0)