C 关闭插座时出现问题

C 关闭插座时出现问题,c,multithreading,sockets,C,Multithreading,Sockets,我正在尝试用线程编写一个客户机/服务器程序。连接完成后,我关闭插座。服务器获得了大量的新连接,套接字数量(文件描述符)增长非常快:运行5分钟后,我的文件描述符数量已经达到了800左右 这是正常的事情吗? 线程是否共享文件描述符? 当我做关闭时(sockfd)该号码是立即发布还是在一段时间后发布 PS:我以前使用fork(),但我没有这个问题。 感谢pthreads(7): POSIX.1还要求线程共享一系列其他线程 属性(即,这些属性是进程范围的,而不是每个线程): 打开文件描述符 从pth

我正在尝试用线程编写一个客户机/服务器程序。连接完成后,我关闭插座。服务器获得了大量的新连接,套接字数量(文件描述符)增长非常快:运行5分钟后,我的文件描述符数量已经达到了800左右

这是正常的事情吗? 线程是否共享文件描述符? 当我做
关闭时(sockfd)该号码是立即发布还是在一段时间后发布

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

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

  • 打开文件描述符
pthreads(7)

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

  • 打开文件描述符

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

请注意,close可能会返回错误,但:

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


检查除套接字之外的其他文件描述符使用情况,可能是您在其他地方泄漏了FD-例如,如果您正在打开普通文件,文件描述符将在所有线程之间共享,因此在一个线程中关闭它将关闭所有其他线程的文件描述符。close()在调用返回时释放fd(除非发生错误)

请注意,close可能会返回错误,但:

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


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

这真的会造成问题吗?你的代码不起作用了吗?为什么您关心一个由实现定义的数字?如果您的系统随机分配文件描述符,并将123456789作为文件描述符提供给您,您会怎么做?@Adrien Plisson,因为文件描述符保证使用可用的最低数量。这意味着,若他得到值为800的新FD,他将打开800个FD,这可能表明资源泄漏——这是很糟糕的。fd数也直接映射到如select()集中的位集,这些位的数量是有限的,因此实际值很重要。什么操作系统?如果您使用的是Linux,您可以通过查看
/proc//fd/
中的文件描述符来查看所有这些文件描述符都引用了什么,这真的会造成问题吗?你的代码不起作用了吗?为什么您关心一个由实现定义的数字?如果您的系统随机分配文件描述符,并将123456789作为文件描述符提供给您,您会怎么做?@Adrien Plisson,因为文件描述符保证使用可用的最低数量。这意味着,若他得到值为800的新FD,他将打开800个FD,这可能表明资源泄漏——这是很糟糕的。fd数也直接映射到如select()集中的位集,这些位的数量是有限的,因此实际值很重要。什么操作系统?如果您在Linux上,您可以通过查看
/proc//fd/