关闭套接字的问题

时间:2010-03-17 09:44:33

标签: c multithreading sockets

我正在尝试使用线程编写客户端/服务器程序。连接完成后我关闭套接字。服务器获得了大量的新连接,套接字号(文件描述符)增加得非常快:运行5分钟后,我已经处于文件描述符号800周围了!

这是正常的吗? 线程共享文件描述符吗? 当我close(sockfd);时,是立即释放的数字还是一段时间之后?

PS:我以前用fork(),我没有这个问题。 感谢

2 个答案:

答案 0 :(得分:2)

来自pthreads(7)

  

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

     
      
  • 打开文件描述符
  •   

答案 1 :(得分:1)

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

请注意,close可以返回错误:

  

不检查close的返回值是一个常见但严重的编程错误。很可能在最后关闭时首先报告先前write(2)操作的错误。没有检查退货          关闭文件时的值可能会导致数据无声丢失。使用NFS和磁盘配额尤其可以观察到这种情况。

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