在下面的服务器代码中调用套接字后,我收到错误“太多打开的文件”。这段代码被重复调用,它只在 server_SD 获得值 1022 之后发生。所以我假设我达到了“ulimit -n”所禁止的 1024 的限制。我不明白的是我正在关闭套接字,这应该使 fd 可重用,但这似乎没有发生。
注意:使用 linux,是的,客户端也关闭了,不,我不是 root 用户,所以移动限制不是一个选项,我应该一次最多打开 20 个(左右)套接字。在我的程序的整个生命周期中,我希望打开和关闭接近 1000000 个套接字(因此需要非常强大的重用)。
server_SD = socket (AF_INET, SOCK_STREAM, 0);
bind (server_SD, (struct sockaddr *) &server_address, server_len)
listen (server_SD,1)
client_SD = accept (server_SD, (struct sockaddr *)&client_address, &client_len)
// read, write etc...
shutdown (server_SD, 2);
close (server_SD)
有谁知道如何保证关闭和可重用性?
谢谢。
最佳答案
使用 --track-fds=yes
选项在 valgrind
下运行您的程序:
valgrind --track-fds=yes myserver
如果您的程序使用包装器或将自身置于后台,您可能还需要 --trace-children=yes
。
如果它没有自行退出,中断它或使用“kill
pid”终止进程(不是 -9
) 在它积累了一些泄漏的文件描述符之后。退出时,valgrind
将显示仍然打开的文件描述符以及与创建它们的位置相对应的堆栈跟踪。
在 strace
下运行您的程序以记录所有系统调用也可能有帮助。另一个有用的命令是 /usr/sbin/lsof
-p
pid 以显示所有当前使用的文件描述符及其用途。
关于linux - 套接字和文件描述符重用(或缺乏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1232482/