我正在尝试使用线程编写客户端/服务器程序。连接完成后我关闭套接字。服务器获得了大量的新连接,套接字号(文件描述符)增加得非常快:运行5分钟后,我已经处于文件描述符号800周围了!
这是正常的吗?
线程共享文件描述符吗?
当我close(sockfd);
时,是立即释放的数字还是一段时间之后?
PS:我以前用fork(),我没有这个问题。 感谢
答案 0 :(得分:2)
来自pthreads(7)
:
POSIX.1还要求线程共享一系列其他线程 属性(即,这些属性是进程范围而不是每个线程):
- 打开文件描述符
答案 1 :(得分:1)
文件描述符在所有线程之间共享,因此在一个线程中关闭它会为所有其他线程关闭它。 close()在调用返回时释放fd(除非发生错误)
请注意,close可以返回错误:
不检查close的返回值是一个常见但严重的编程错误。很可能在最后关闭时首先报告先前write(2)操作的错误。没有检查退货 关闭文件时的值可能会导致数据无声丢失。使用NFS和磁盘配额尤其可以观察到这种情况。
检查除套接字之外的其他文件描述符使用情况,也许你在其他地方泄漏fds - 例如如果您正在打开普通文件