【发布时间】:2010-03-17 09:44:32
【问题描述】:
我正在尝试使用线程编写客户端/服务器程序。连接完成后,我关闭套接字。服务器获得了大量新的连接,并且套接字编号(文件描述符)增加得非常快:运行 5 分钟后,我的文件描述符编号已经达到 800 左右!
这是正常现象吗?
线程是否共享文件描述符?
当我做close(sockfd); 时,号码是立即发布还是在一段时间后发布?
PS:我以前用fork(),我没有这个问题。 谢谢
【问题讨论】:
-
这真的有问题吗?你的代码不工作吗?你为什么关心实现定义的数字?如果您的系统随机分配文件描述符并给您 123456789 作为文件描述符,您会怎么做?
-
@Adrien Plisson 因为文件描述符保证使用可用的最低数字。这意味着如果他获得值为 800 的新 fd,则他打开了 800 个 fd,这很可能表明资源泄漏——这很糟糕。 fd 编号也直接映射到例如一个 select() 集合,并且这些位数是有限的 - 所以实际值很重要。
-
什么操作系统?如果您使用的是 Linux,您可以通过查看
/proc/<pid>/fd/来查看这些文件描述符所引用的内容
标签: c multithreading sockets