2010-03-17 65 views
0

我想用线程编写客户机/服务器程序。连接完成后关闭插座。服务器获得了很多新的连接,并且套接字号(文件描述符)增加得非常快:运行5分钟后,我已经处于800左右的文件描述符了!关闭套接字的问题

这是正常的事情吗? 线程共享文件描述符吗? 当我做close(sockfd);是立即发布还是过了一段时间? PS:我曾经用fork()做过,而我没有这个问题。 由于

+1

这是否真的会造成问题?你的代码不工作?你为什么关心一个被实现定义的数字?如果你的系统随机分配了文件描述符并给你123456789作为文件描述符,你会怎么做? – 2010-03-17 09:48:55

+1

@Adrien Plisson由于filedescriptors保证使用可用的最小编号。这意味着如果他获得了800的新fds,他有800 fds打开,这可能表明资源泄漏 - 这是不好的。该fd号也直接映射到例如一个select()集合,这些位数是有限的 - 所以实际值很重要。 – nos 2010-03-17 10:02:46

+0

什么操作系统?如果你在Linux上,你可以通过查看'/ proc//fd /'来查看这些文件描述符的全部内容。 – caf 2010-03-17 12:53:23

回答

1

文件描述符在所有线程中共享,因此在一个线程中关闭它会关闭所有其他线程。 close()方法释放FD时,调用返回(除非出现错误)

注意,接近可以返回虽然错误:

不检查关闭的返回值是一种常见的,但仍然严重的编程错误。先前写入(2)操作中的错误很有可能在最后关闭时首先报告。在关闭文件时不检查返回值 可能会导致数据无提示丢失。这可以通过NFS和磁盘配额来观察。

检查其他文件描述符的使用比你的套接字,也许你在其他地方泄漏fds - 例如,如果你打开正常的文件

2

pthreads(7)

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

  • 打开的文件描述符