【问题标题】:problem with closing sockets关闭套接字的问题
【发布时间】: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


【解决方案1】:

来自pthreads(7)

POSIX.1 还要求线程共享一系列其他 属性(即,这些属性是进程范围的,而不是每个线程的):

  • 打开文件描述符

【讨论】:

    【解决方案2】:

    文件描述符在所有线程之间共享,因此在一个线程中关闭它会为所有其他线程关闭它。 close() 在调用返回时释放 fd(除非发生错误)

    请注意,虽然关闭可能会返回错误:

    不检查 close 的返回值是一个常见但严重的编程错误。上一次 write(2) 操作的错误很有可能在最后关闭时首先报告。不检查退货 关闭文件时的值可能会导致数据无声丢失。这在 NFS 和磁盘配额中尤其明显。

    检查您的套接字以外的其他文件描述符使用情况,也许您正在其他地方泄漏 fds - 例如如果您正在打开普通文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2013-09-22
      • 1970-01-01
      • 2014-03-12
      • 2012-01-03
      相关资源
      最近更新 更多