1

我有一个客户端 tcp 套接字(在 c++ 中),它有一个循环,它会重试打开一个套接字并以一定的时间间隔连接到服务器,直到它成功。

程序中的一个错误导致close在连接失败后无法在文件描述符上调用socket,并且connect在调用时再次使用相同的(打开的)描述符,并且在重试重新连接时在循环的下一次迭代中再次使用。

在 Linux 机器上,这不会导致任何问题,而在 HPUX 上,它最终会导致错误 24 - “打开的文件过多” - lsof 将这些显示为TCP *:* (IDLE).

Linux 和 HPUX 之间有什么区别?

4

2 回答 2

2

我相信它来自 HPUX 向内核添加套接字的起源。如果我没记错的话(从 1980 年代后期开始),他们将 Berkeley Sockets 添加为可共享的对象库——本质上是文件 i/o 系统之上的一两层。

该 UX 仍然以这种方式运行,表明 socket() 调用没有重用未使用的文件描述符,可能是因为它不知道它们,并且没有维护工程师负责添加它。在 Linux 中,socket() 与其他主要组件一样是内核的一部分,因此它当然知道哪些文件描述符可供重用。

于 2009-11-11T18:58:41.667 回答
0

在 HPUX 上,一个进程可以同时打开的文件的限制似乎是60 ,而在 Linux 上是 1024

于 2009-11-11T19:01:20.197 回答