我有一个客户端tcp套接字(在c ++中),它有一个循环,它重试打开套接字并以一定的间隔连接到服务器,直到成功为止。
程序中的错误导致连接失败后未在文件描述符上调用close
,并且在调用socket
和connect
时再次使用相同(开放)描述符在重试重新连接时,在循环的下一次迭代中。
在Linux机器上,这不会导致任何问题,而在HPUX上它最终会导致错误24 - “打开的文件过多” - lsof将这些显示为TCP *:* (IDLE)
。
Linux和HPUX有什么区别?
答案 0 :(得分:2)
我认为它来自HPUX为内核添加套接字的起源。如果我没记错的话(从20世纪80年代后期开始),他们将Berkeley套接字添加为可共享的对象库 - 基本上是文件i / o系统之上的一层或两层。
UX仍然表现出那种方式表明socket()调用没有重用未使用的文件描述符,可能是因为它不知道它们,并且没有任何维护工程师负责添加它。在Linux中,socket()和其他主要组件一样是内核的一部分,所以当然它知道哪些文件描述符可以重用。
答案 1 :(得分:0)
似乎进程可以同时打开的文件限制是60 by default on HPUX,而on Linux is 1024。